【刷题】Leetcode207(拓扑排序)

Leetcode207

拓扑排序讲解见https://blog.csdn.net/moX980/article/details/107870775
image-20200807212819375

题目分析:典型的拓扑序问题

在向队列压入入度为0的值的同时ans++,最后比较ans和numCourse是否相等即可

ans表示能够到达的点(即前置条件已经达到)

PS:注意当没有给定任何前置条件时答案为true

class Solution {
public:
    //链式前向星存边
    //c/c++混合
    struct edge{
        int to, next;
    };
    
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        if(prerequisites.size() == 0) return true;
        edge edg[prerequisites.size() + 5];
        int head[numCourses + 5], in_degree[numCourses + 5], edg_cnt = 0;
        memset(in_degree, 0, sizeof(in_degree));
        memset(head, -1, sizeof(head));
        for(auto iter = prerequisites.begin(); iter != prerequisites.end(); iter++){
            vector<int> vec = *iter;
            edg[edg_cnt].to = vec[1];
            edg[edg_cnt].next = head[vec[0]];
            head[vec[0]] = edg_cnt++;
            in_degree[vec[1]]++;
        }
        int ans = 0;
        queue<int> que;
        for(int i = 0; i < numCourses; i++){
            //printf("indegree[%d] = %d\n", i, in_degree[i]);
            if(in_degree[i] == 0) {
                que.push(i);
                //cout << i << endl;
                ans++;
            }
        }
        
        while(!que.empty()){
            int t = que.front();
            que.pop();
            for(int i = head[t]; i != -1; i = edg[i].next){
                int e = edg[i].to;
                in_degree[e]--;
                if(in_degree[e] == 0) {
                    //cout << e << endl;
                    que.push(e);
                    ans++;
                }
            }
        }
        return numCourses == ans;
    }
};
class Solution {
public:
    //c++口味更重一些
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        if(prerequisites.size() == 0) return true;
        vector<int> in_degree(numCourses, 0);
        vector<vector<int>> to(numCourses);
        for(vector<int>vec : prerequisites){
            in_degree[vec[1]]++;
            to[vec[0]].push_back(vec[1]);
        }
        int ans = 0;
        queue<int> que;
        for(int i = 0; i < in_degree.size(); i++){
            //printf("indgree[%d] = %d\n", i, in_degree[i]);
            if(in_degree[i] == 0) {
                //printf("push(%d)\n", i);
                que.push(i);
                ans++;
            }
        }
        while(!que.empty()){
            int t = que.front();
            que.pop();
            for(int a : to[t]){
                in_degree[a]--;
                if(in_degree[a] == 0){
                    //printf("push(%d)\n", a);
                    que.push(a);
                    ans++;
                }
            }
        }
        //cout << "ans = " << ans << endl;
        return ans == numCourses;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙diao网友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值