DAG 模板
Talk is cheap. Show me the code.
——linux 的创始人 Linus Torvalds
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn = 1e5+5;
const int maxm = 3e5+5;
int head[maxn],Next[maxm],edge[maxm],tot; //Next
int deg[maxn];
int n, m;
queue<int> q;
void add(int x, int y){
edge[++tot] = y;
Next[tot] = head[x];
head[x] = tot;
}
int topsort(int n){
int cnt = 0;
for(int i = 1; i <= n; i++)
if(deg[i] == 0) q.push(i);
while(!q.empty()){
int x = q.front();
q.pop();
cnt++;
for(int i = head[x]; i; i = Next[i]){
int y = edge[i];
deg[y]--;
if(deg[y] == 0) q.push(y);
}
}
return cnt == n;
}
int main(){
cin >> n >> m;
for (int i = 1; i <= m; i++){
int u, v;
cin >> u >> v;
add(u, v);
deg[v]++;
}
if(topsort(n)) cout << "Yes" << endl;
else cout << "No" << endl;
return 0;
}