题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342
思路:直接拓扑排序即可。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include<vector> 7 using namespace std; 8 bool map[111][111]; 9 vector<int>vet[111]; 10 int from[111]; 11 int n,m; 12 13 void floyd() 14 { 15 for(int k=0;k<n;k++) 16 for(int i=0;i<n;i++) 17 for(int j=0;j<n;j++) 18 map[i][j]=(map[i][j]||(map[i][k]&&map[k][j])); 19 } 20 21 bool Solve() 22 { 23 queue<int>Q; 24 int cnt=0; 25 for(int i=0;i<n;i++){ 26 if(from[i]==0){ Q.push(i);cnt++; } 27 } 28 while(!Q.empty()){ 29 int u=Q.front(); 30 Q.pop(); 31 for(int i=0;i<vet[u].size();i++){ 32 int v=vet[u][i]; 33 if(from[v]>0){ 34 from[v]--; 35 if(from[v]==0){ Q.push(v);cnt++; } 36 } 37 } 38 } 39 if(cnt==n)return true; 40 return false; 41 } 42 43 44 int main(){ 45 int u,v; 46 while(scanf("%d%d",&n,&m),n){ 47 memset(map,false,sizeof(map)); 48 memset(from,0,sizeof(from)); 49 for(int i=0;i<n;i++)vet[i].clear(); 50 while(m--){ 51 scanf("%d%d",&u,&v); 52 map[u][v]=true; 53 } 54 for(int i=0;i<n;i++) 55 for(int j=0;j<n;j++)if(i!=j){ 56 if(map[i][j]){ from[j]++;vet[i].push_back(j); } 57 } 58 bool flag=Solve(); 59 flag?puts("YES"):puts("NO"); 60 } 61 return 0; 62 }