Top 拓扑排序算法(有向无环图)

Top拓扑排序是一个图论算法,

它可以判环,就是判断题个图内是否有环。

主要是通过统计每个点的入度,当要遍历一个点时把他的入度减一,

当有点的入读为零时,就把它放在队列里,长得和BFS挺像。

裸题:

在 X 星球上,有n个村庄。这些村庄之间通过 有向 的道路连接,但是并不保证任意两个村庄都是相互可达的。并且两个村庄直接可能有多条道路。一个村庄是诡异的村庄当且可以从它出发经过若干条道路,路过不低于一个村庄回到原来的村庄。

给出这些村庄的道路连接情况,判断是否存在诡异村庄。

题目输入
第一行一个T,表示测试组数。
每组测试样例的第一行一个n和m,分别表示村庄的个数和有多少条有向道路,村庄的编号是 。
接下来m行,每行是两个数字u[i],v[i]表示有一条从u[i]到v[i]的有向道路,保证不包含重边和自环。

题目输出
 输出T行,对于每组测试样例,如果存在诡异村庄,输出 1,否则输出 0。
样例输入
2
7 6
2 3
3 4
4 3
5 6
6 7
7 5
4 2
1 2
2 3
样例输出
1
0

代码:

#include<bits/stdc++.h>
using namespace std;
vector<int > G[100005];
int inde[100005];
queue<int > q;
int n,m;
int top(){
    int sum = 0 ;
    for(int i = 1 ; i <= n ; i ++) {
        if (inde[i] > 0 ) continue ;
        q.push(i);
        sum ++ ;
    }
    while (!q.empty()){
        int t = q.front();
        q.pop();
        for(int i = 0 ; i < G[t].size();i++){
            int y = G[t][i];
            inde[y]--;
            if (inde[y] == 0 ) {
                q.push(y);
                sum ++;
            }
        }
    }
    return sum ;
}
int main(){
    int t ;
    cin >> t ;
    while(t--){
        cin >> n >> m;
        memset(inde,0,sizeof(inde));
        for(int i = 1 ; i <= n ; i ++) G[i].clear();
        for(int i = 0 ; i < m ; i ++){
            int u , v;
            cin >> u >> v;
            G[u].push_back(v);
            inde[v]++;
        }
        int x = top();
        if (x == n) cout << '0' << endl ;
        else cout << '1' << endl ;
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值