hdu 4324 Triangle LOVE(拓扑排序)
Triangle LOVE
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/65536K (Java/Other)
Total Submission(s) : 16 Accepted Submission(s) : 11
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Recently, scientists find that there is love between any of two people. For example, between A and B, if A don’t love B, then B must love A, vice versa. And there is no possibility that two people love each other, what a crazy world!
Now, scientists want to know whether or not there is a “Triangle Love” among N people. “Triangle Love” means that among any three people (A,B and C) , A loves B, B loves C and C loves A.
Your problem is writing a program to read the relationship among N people firstly, and return whether or not there is a “Triangle Love”.
Now, scientists want to know whether or not there is a “Triangle Love” among N people. “Triangle Love” means that among any three people (A,B and C) , A loves B, B loves C and C loves A.
Your problem is writing a program to read the relationship among N people firstly, and return whether or not there is a “Triangle Love”.
Input
The first line contains a single integer t (1 <= t <= 15), the number of test cases.
For each case, the first line contains one integer N (0 < N <= 2000).
In the next N lines contain the adjacency matrix A of the relationship (without spaces). Ai,j = 1 means i-th people loves j-th people, otherwise Ai,j = 0.
It is guaranteed that the given relationship is a tournament, that is, Ai,i= 0, Ai,j ≠ Aj,i(1<=i, j<=n,i≠j).
For each case, the first line contains one integer N (0 < N <= 2000).
In the next N lines contain the adjacency matrix A of the relationship (without spaces). Ai,j = 1 means i-th people loves j-th people, otherwise Ai,j = 0.
It is guaranteed that the given relationship is a tournament, that is, Ai,i= 0, Ai,j ≠ Aj,i(1<=i, j<=n,i≠j).
Output
For each case, output the case number as shown and then print “Yes”, if there is a “Triangle Love” among these N people, otherwise print “No”.
Take the sample output for more details.
Take the sample output for more details.
Sample Input
2 5 00100 10000 01001 11101 11000 5 01111 00000 01000 01100 01110
Sample Output
Case #1: Yes Case #2: No
#include <iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; int i,j,n,t; int cnt[2002]; char mp[2002][2002]; bool toposort() { queue<int> Q; int num=0; for(int i=0;i<n;i++) if (cnt[i]==0) Q.push(i); if(Q.empty()) return 0; while(!Q.empty()) { int u=Q.front(); Q.pop(); num++; for(int i=0;i<n;i++) if (mp[u][i]=='1') { cnt[i]--; if (cnt[i]==0) Q.push(i); if (cnt[i]<0) return 0; } } if (num<n) return 0; return 1; } int main() { scanf("%d",&t); for(int ii=1;ii<=t;ii++) { scanf("%d",&n); memset(cnt,0,sizeof(cnt)); for(i=0;i<n;i++) { scanf("%s",mp[i]); for(j=0;j<n;j++) if (mp[i][j]=='1') cnt[j]++; } printf("Case #%d: ",ii); if (!toposort()) printf("Yes\n"); else printf("No\n"); } return 0; }