应用:交通运输,社交网络,互联网,工作安排,脑区活动
图的分类:
- 无向图和有向图(无向图是一种特殊的有向图)
- 无权图和有权图
简单图不包括自环边和平行边。
- 自环边:自己指向自己
- 平行边:两个点有多条边
图的表示:
- 邻接矩阵:适用稠缪图(Dense Graph,每个点几乎与每个点相连,即完全图)
- 邻接表:适用稀疏图(Sparse Graph)
public class SparseGraph {
private int n;
private int m;
private boolean directed;
private List<Integer>[] g;
public SparseGraph(int n, boolean directed) {
assert n >= 0;
this.n = n;
this.m = 0; // 初始化没有任何边
this.directed = directed;
g = (ArrayList<Integer>[]) new ArrayList[n];
for (int i = 0; i < n; i++) {
g[i] = new ArrayList<Integer>();
}
}
public int V(){ return n; }
public int E(){ return m; }
// 向图中添加一个边
public void addEdge(int v, int w){
assert v >= 0 && v < n ;
assert w >= 0 && w < n ;
g[v].add(w);
if( v != w && !directed ) //判断了自环边和有向边
g[w].add(v);
m ++;
}
// 复杂度最差为O(n),一般不用这个~
public boolean hasEdge(int v, int w){
assert v >= 0 && v < n;
assert w >= 0 && w < n;
for(int i = 0; i < g[v].size(); i ++){
if(g[v].get(i) == w)
return true;
}
return false;
}
}