图是有一组顶点 和一组能将两个顶点连接的边 组成。 自环 :一条连接一个顶点和自身的边。平行边 :连接同一对顶点的两条边。
术语表
两个顶点通过一条边相连,两个顶点相邻 。 顶点的度 为依附于它的总边数 互不相邻的树组成的集合称为生成树森林
无向图的数据类型和常用代码
public static int degree (Graph G, int v){
int degree = 0 ;
for (int w : G.adj(v)) degree++;
return degree;
}
public static int maxDegree (Graph G){
int max = 0 ;
for (int v = 0 ; v < G.V(); v++){
if (degree(G, v) > max)
max = degree(G, v);
}
}
public static double avgDegree (Graph G){
return 2.0 * G.E() / G.V();
}
public static int numberOfSelfLoops (Graph G){
int count = 0 ;
for (int v = 0 ; v < G.V(); v++){
for (int w : G.adj(v)){
if (v == w ) count++;
}
}
return count / 2 ;
}
public String toString (){
String s = V + " vertices, " + E +" edges \n" ;
for (int v = 0 ; v < V; v++){
s += v + ": " ;
for (int w : this .adj(v))
s += w + " " ;
s += "\n" ;
}
return s;
}
Graph图的数据结构
非稠密图的标准表示称为邻接表 的数据结构,将每个顶点的所有相邻顶点都保存在该顶点对应的元素所指向的一张链表中。 graph数据类型
public class Graph {
private final int V;
private int E;
private Bag<Integer>[] adj;
public Graph (int V){
this .V = V;this .E = 0 ;
adj = (Bag<Integer>[]) new Bag[V];
for (int v = 0 ; v < V; v++){
adj[v] = new Bag<Integer>();
}
}
public Graph (In in){
this (in.readInt());
int E = in.readInt();
for (int i = 0 ;i < E; i++){
int v = in.readInt();
int w = in.readInt();
addEdge(v, w);
}
}
public int V (){
return V;
}
public int E (){
return E;
}
public void addEdge (int v, int w){
adj[v].add(w);
adj[w].add(v);
E++;
}
public Iteralbe<Integer> adj (int v){
return adj[v];
}
public static int degree (Graph G, int v){
int degree = 0 ;
for (int w : G.adj(v)) degree++;
return degree;
}
public static int maxDegree (Graph G){
int max = 0 ;
for (int v = 0 ; v < G.V(); v++){
if (degree(G, v) > max) max = degree(G, v);
}
return max;
}
public static double avgDegree (Graph G){
return 2.0 * G.E() / G.V();
}
}