有向图判断是否有环

There are a total of n courses you have to take, labeled from 0 to n - 1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?

For example:

2, [[1,0]]

There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.

2, [[1,0],[0,1]]

There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.

 public class Graph {
    //顶点数
    int vexNum;
    //边数
    int edgeNum;
    //边集
    List<Edge> edges;
    //放边的索引号,从0开始
    List<Integer> vex[];
    
    class Edge {
        int from;
        int to;
        //距离
        int dist;

        Edge(int from, int to, int dist) {
            this.from = from;
            this.to = to;
            this.dist = dist;
        }
    }
    
     List<Integer> getAdjVexs(int v){
        List<Integer> adjVexs = new ArrayList<Integer>();
        for (int i : vex[v]) {
            adjVexs.add(edges.get(i).to);
        }
        return  adjVexs;
    }
     public Graph(int n) {
        vexNum = n;
        vex = new List[n];
        for (int i = 0; i < n; i++) {
            vex[i] = new ArrayList<Integer>();
        }
        edges = new ArrayList<Edge>();
    }

    public void addEdge(int from, int to, int dist) {
        edges.add(new Edge(from, to, dist));
        edgeNum = edges.size();
        vex[from].add(edgeNum - 1);
    }
   }
    
    int vis[] = new int[5000];

    boolean dfsGraph(Graph g, int v) {
        if (vis[v] == 1) {
            return false;
        } else {
            if (vis[v] == 0) {
                vis[v] = 1;
                for (int u : g.getAdjVexs(v)) {
                    if (!dfsGraph(g, u))
                        return false;
                }
                vis[v] = 2;
            }
            return true;
        }

    }

    public boolean canFinish(int numCourses, int[][] prerequisites) {
        Graph g = new Graph(numCourses);
        for (int i = 0; i < prerequisites.length; i++)
            g.addEdge(prerequisites[i][1], prerequisites[i][0], 0);
        int i;
        for (i = 0; i < numCourses; i++) {
            if (vis[i] == 0) {
                boolean b = dfsGraph(g, i);
                if (!b) break;
            }
        }
        return i == numCourses;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值