有向图的实现

本文介绍了一个简单的有向图类的Java实现,包括通过构造函数初始化顶点和边,从文件加载图结构,添加边,获取顶点和边的数量,以及反转有向图等方法。
public class DirectedGraph {
    private  int vertex;//顶点
    private int edge;//边
    private LinkedList<Integer>[] adj;//邻接表
    /**
     * 内部创建
     * @param v 顶点
     */
    @SuppressWarnings("unchecked")
    public DirectedGraph(int v){
        this.vertex = v;
        edge = 0;
        adj = new LinkedList[v];
        for(int i=0;i<v;i++){
            adj[i] = new LinkedList<>();
        }
    }
    /**
     * 通过加载文件创建
     * @param file
     * @throws IOException
     */
    @SuppressWarnings("unchecked")
    public DirectedGraph(File file) throws IOException{
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        int vertex = Integer.parseInt(br.readLine());//读取顶点数
        this.vertex = vertex;//读取顶点数
        //创建有顶点数的邻接表
        adj = new LinkedList[vertex];
        for(int i=0;i<vertex;i++){
            adj[i] = new LinkedList<>();
        }
        int edge = Integer.parseInt(br.readLine());//读取边
        for(int i=0;i<edge;i++){
            //获取顶点对
            String[] vertexs = br.readLine().split(" ");
            int v = Integer.parseInt(vertexs[0]);
            int m = Integer.parseInt(vertexs[1]);
            //将顶点对添加成一条边
            addEdge(v, m);
        }
        if(br!= null){
            br.close();
        }

    }
    /**
     * 添加 一条双向边
     * @param v
     * @param m
     */
    public void addEdge(int v,int m){
        adj[v].add(m);
        //边数+1
        edge++;
    }
    /**
     * 获取顶点数
     * @return
     */
    public int vertexNum(){
        return vertex;
    }
    /**
     * 边数
     * @return
     */
    public int edgeNum(){
        return edge;
    }
    /**
     * 返回临界链表迭代器
     * @param v
     * @return
     */
    public Iterable<Integer> adj(int v){
        return adj[v];
    }
    /**
     * 有向图取反
     * @return
     */
    public DirectedGraph reverser(){
        DirectedGraph directedGraph = new DirectedGraph(vertex);
        for(int v = 0;v<vertex;v++){
            for(int w:adj(v)){
                directedGraph.addEdge(w, v);
            }
        }
        return directedGraph;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值