无向图.md

本文介绍了无向图的概念,包括自环和平行边,并详细阐述了图的术语,如顶点的度和生成树森林。接着讨论了无向图的数据类型,如计算顶点度数、最大度数、平均度数和自环数量的代码实现。最后,重点讲解了邻接表作为无向图标准表示的数据结构。

  • 图是有一组顶点和一组能将两个顶点连接的组成。
  • 自环:一条连接一个顶点和自身的边。
  • 平行边:连接同一对顶点的两条边。

术语表

  • 两个顶点通过一条边相连,两个顶点相邻
  • 顶点的为依附于它的总边数
  • 互不相邻的树组成的集合称为生成树森林

无向图的数据类型和常用代码

  • 计算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);
   }
}
  • 计算所有顶点的平均度数
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;    //num of node
    private int E;          //number of edge
    private Bag<Integer>[] adj; //neighbour  table

    public Graph(int V){
        this.V = V;this.E = 0;
        adj = (Bag<Integer>[]) new Bag[V];
        for(int v = 0; v < V; v++){     //initialize all of linked table
            adj[v] = new Bag<Integer>();
        }
    }

    public Graph(In in){
        this(in.readInt());
        int E = in.readInt();
        for(int i = 0;i < E; i++){
            //add edge
            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();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值