不懂的看这里
以下是例题:
简单拓扑判环
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;
vector<int> G[maxn];
int inDeg[maxn];
int n,m;
queue<int>q;
int sum;
bool top(){
while(!q.empty()) q.pop();
sum = 0;
for(int i = 1;i <= n ; i++) if(!inDeg[i]) q.push(i);
while(!q.empty()){
int to = q.front();
q.pop();
sum ++;
for(int i = 0; i < G[to].size(); i++){
int edge = G[to][i];
inDeg[edge] --;
if(!inDeg[edge]) q.push(edge);
}
}
if(sum == n) return 1;
else return 0;
}
int main(){
// int n ;
int t;
cin >> t ;
while(t--){
cin >> n;
cin >> m;
memset(G,0,sizeof(G));
memset(inDeg,0,sizeof(inDeg));
for(int i =1;i <= m ; i++) {
int u , v;
cin >> u >> v;
G[u].push_back(v);
inDeg[v]++;
}
if(top()) cout << "Correct" << endl;
else cout << "Wrong" << endl;
}
return 0;
}
同上,注意0 ~ n-1
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;
const int mod = 142857;
vector<int> G[maxn];
int virus[maxn];
int inDeg[maxn];
int n,m;
int sum = 0;
queue<int>q;
bool topsort(){
while(!q.empty()) q.pop();
sum = 0;
for(int i = 0;i < n ; i++) if(!inDeg[i]) q.push(i);
while(!q.empty()){
int to = q.front();
q.pop();
sum ++;
for(int i = 0; i < G[to].size(); i++){
int edge = G[to][i];
inDeg[edge] --;
if(!inDeg[edge]) q.push(edge);
// virus[edge] = (virus[edge] + virus[to]) % mod;
}
}
if(sum == n)return 1;
else return 0;
}
int main(){
// int n ;
int k ;
while(cin >> n){
cin >> m;
if(!n&&!m) break;
// cin >> k;
//memset(virus, 0 , sizeof virus);
//int x;
//for(int i = 1; i <= k ; i++) cin >> x,virus[x] ++;
memset(G,0,sizeof(G));
memset(inDeg,0,sizeof(inDeg));
for(int i =