这题没什么好说的,拓扑排序判断回路模板。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
bool judge(int v[105][105], int d[105], int n){
for(int i = 0; i < n; i++){
int tmp = n;
for(int j = 0; j < n; j++){
if(!d[j]){
tmp = j;
d[j]--;
break;
}
}
if(tmp == n)
return 0;
for(int j = 0; j < n; j++)
if(v[tmp][j])
d[j]--;
}
return 1;
}
int main()
{
int n, m;
while(scanf("%d %d", &n, &m) != EOF, n && m){
int v[105][105], d[105];
memset(v, 0, sizeof(v));
memset(d, 0, sizeof(d));
while(m--){
int x, y;
scanf("%d %d", &x, &y);
if(!v[x][y]){
v[x][y] = 1;
d[y]++;
}
}
puts(judge(v, d, n) ? "YES" : "NO");
}
return 0;
}
有一个小tip:c++定义一维int数组的时候会全部初始化成0,但二维的时候不会。。