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;
}