美文网首页
无向图(一)

无向图(一)

作者: sleepyjoker | 来源:发表于2016-09-25 17:11 被阅读101次

定义 图是一组顶点和一组能够将两个顶点相连的边组成的。而把边仅仅是两个顶点的连接的图称为无向图。


无向图API  
public class Graph
            Graph(int v)        //创建一个含有v个顶点但不含有边的图
            Graph(In in)        //从标准输入流in读入一幅图
       int  V()          //返回顶点数
       int  E()          //返回边数
       void addEdge(int v, int w)    //向图中添加一条边v-w
       Iterable<Integer> adj(int v)      //和v相邻的所有顶点
       String  toString()    //对象的字符串表示

API中包含两个构造函数,两个方法分别返回顶点数和边数,一个方法用来添加一条边,toString()和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 int aveDegree(Graph G){
    return 2.0 * G.E() / G.V();
}
//计算自环的个数
public static int numberOfSelfLoops(Graph G){
    int count;
    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 + " verticles, " + E + " edges\n";
    for( int v = 0; v < V; v++){
        s += v + ": ";
        for(int w: this.adj(v))
            s += w+ " ";
        s += "\n";
    }
    return s;
}

** 图的表示方式 **
存储图并实现API的的数据结构需要满足一些要求:
1.它必须为可能在应用中碰到的各种类型的图保留出足够的空间;
2.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());                  //读取v并将图初始化
        int E = in.readInt();              //读取E
        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 Iterable<Integer> adj(int v){
        return adj[v];
    }
}

相关文章

  • 图的定义及抽象表示

    一、无向图 1.1 无向图的定义 边没有方向的图称为无向图。 API定义: 1.2 无向图的抽象表示 1.2.1 ...

  • 无向图(一)

    定义 图是一组顶点和一组能够将两个顶点相连的边组成的。而把边仅仅是两个顶点的连接的图称为无向图。 API中包含两...

  • 任务调度-DAG和Oozie基础

    本文主要内容 有向无环图 拓扑排序 Oozie 有向无环图 什么是有向无环图 有向无环图(Directed Acy...

  • 71_图的定义与操作

    关键词:图的定义、无向边与无向图、无向边与无向图、顶点邻接(Adjacent)的定义、度(Degree)的定义、 ...

  • 邻接矩阵深广遍历

    /无向图 //正确,无向图可以改成有向图\ //如果用模板,要记得 //template //...

  • 『学概念找员外』有向无环图DAG的用途

    有向无环图 有向无环图(DAG, Directed Acyclic Graph):是一个无回路的有向图。如果有一个...

  • 数据结构--图的定义及存储结构

    一、 图的定义和术语1、 图按照无方向和有方向分为“无向图”和“有向图” 无向图是由顶点和边构成,有向图是由顶...

  • 图的表示

    图的概念 无向图无向图 有向图有向图 带权图带权图 顶点:图中的元素。 边:图中的一个顶点可以与任意其他顶点建立连...

  • DirectedAcyclicGraph

    有向无环图,所有的树都是有向无环图

  • 离散数学大概(四)

    树连通无回路的无向图称为无向树,或树。每个连通分支都是树的无向图称为森林。平凡图称为平凡树。在无向树中,悬挂顶点(...

网友评论

      本文标题:无向图(一)

      本文链接:https://www.haomeiwen.com/subject/aqefyttx.html