Triangle love
Time Limit: 2000/1000 MS (Java/others) memory limit: 65536/65536 K (Java/Others)
Total submission (s): 2455 accepted submission (s): 997
Problem descriptionrecently, 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.
Your problem is writing a program to read the relationship among N people firstly, and return whether or not there is a "triangle love ".
Inputthe 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 ).
Outputfor 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.
Sample Input
25001001000001001111011100050111100000010000110001110
Sample output
Case #1: YesCase #2: No
I don't know why a triangle ring is included in a ring ..
#include <stdio.h>#include <string.h>#define maxn 2002bool map[maxn][maxn];char buf[maxn];int indegree[maxn], queue[maxn];void addEdge(int n){int i, j;for(i = 0; i < n; ++i){scanf("%s", buf);for(j = 0; j < n; ++j)if(buf[j] == '0') map[i][j] = 0;else{map[i][j] = 1;++indegree[j];}}}bool topoSort(int n){int i, u, front = 0, back = 0;for(i = 0; i < n; ++i)if(!indegree[i]) queue[back++] = i;while(front != back){u = queue[front++];for(i = 0; i < n; ++i){if(map[u][i] && !--indegree[i])queue[back++] = i;}}return back == n;}int main(){int t, n, cas = 1;scanf("%d", &t);while(t--){memset(indegree, 0, sizeof(indegree));scanf("%d", &n); addEdge(n);printf("Case #%d: ", cas++);if(!topoSort(n)) printf("Yes\n");else printf("No\n");}return 0;}