编程技术网

关注微信公众号,定时推送前沿、专业、深度的编程技术资料。

 找回密码
 立即注册

QQ登录

只需一步,快速开始

极客时间

图(graph)的邻接表

何处说感恩 知识图谱 2021-12-22 09:15 91人围观

腾讯云服务器
  • 邻接表表示无向图
  • 邻接表表示有向图
/**
* 稀松图-领接表
*/
public class SparseGraph {

    private int n;  // 节点数
    private int m;  // 边数
    private boolean directed;    // 是否为有向图
    private Vector<Integer>[] g; // 图的具体数据

    // 构造函数
    public SparseGraph( int n , boolean directed ){
        assert n >= 0;
        this.n = n;
        this.m = 0;    // 初始化没有任何边
        this.directed = directed;
        // g初始化为n个空的vector, 表示每一个g[i]都为空, 即没有任和边
        g = (Vector<Integer>[])new Vector[n];
        for(int i = 0 ; i < n ; i ++){
            g[i] = new Vector<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 ++;
    }

    // 验证图中是否有从v到w的边 -->时间复杂度:O(n)
    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].elementAt(i) == w ){
                return true;
            }
        }
        return false;
    }
    
    //遍历邻边
    //返回图中一个顶点的所有相邻顶点
    public Iterable<Integer> adj(int v){
    	assert v>=0 && v<n;
    	return g[v];
	}
}
腾讯云服务器 阿里云服务器
关注微信
^