<pre name="code" class="java"><span style="font-size:18px;">import java.util.LinkedList;
/**
* 用邻接表(其实就是前面博客实现的哈希表)实现无向图
* @author xxxu
*
*/
public class Graph {
private final int V;//顶点数目
private int E; //边的数目
private LinkedList<Integer>[] adj; //邻接表(其实就是前面博客实现的哈希表)
/**
* 根据顶点初始化图
* @param V
*/
public Graph(int V){
this.V=V;
this.E=0;
adj=new LinkedList[V]; //有多少顶点就创建多大的数组邻接表
for(int v=0;v<V;v++){ //初始化所有链表为空
adj[v]=new LinkedList();
}
}
/**
* 返回顶点数目
* @return
*/
public int V(){
return V;
}
/**
* 返回边的数目
* @return
*/
public int E(){
return E;
}
public void addEdge(int v,int w){
adj[v].add(w); //将w添加到v的链表中
adj[w].add(v); //将v添加到w的链表中
E++;
}
public LinkedList<Integer> adj(int v){
return adj[v];
}
/**
* 计算v的度数(多少条边连接这个顶点)
* @return
*/
public int degree(Graph G,int v){
int deg=0;
for (int w:adj(v)) {
deg++;//也就是多少个顶点就多少条边
}
return deg;
}
/**
* 返回所有顶点中的最大度数
* @param G
* @return
*/
public int maxDegree(Graph G){
int max=0;
for (int v = 0; v < V(); v++) {
if(degree(G, v)>max){
max=degree(G, v);
}
}
return max;
}
/**
* 计算所有顶点的平均度数(一条边连接两个顶点)
* @param G
* @return
*/
public double avgDegree(Graph G){
return 2.0*E()/V();
}
/**
* 计算自环的个数
* @return
*/
public int numberOfSelfLoops(Graph G){
int count=0;
for (int v = 0; v < V(); v++) {
for (int w : adj(v)) { //每个顶点都和相邻的顶点比一次,如果相等那么就是自环
if(v==w){
count++;
}
}
}
return count/2;//每条边都被记过两次
}
/**
* 重写toString方法
*/
@Override
public String toString() {
String s=V + " vertices, " + E + " edges\n";
for (int v = 0; v < V; v++) {
s+=v+": ";
for(int w:adj(v)){
s+=w+" ";
}
s+="\n";
}
return s;
}
}</span>
用邻接表实现无向图
最新推荐文章于 2022-08-22 11:35:39 发布