Triangle LOVE
Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other)
Total Submission(s) : 49   Accepted Submission(s) : 30
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”.
 

 

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). A[sub]i,j[/sub] = 1 means i-th people loves j-th people, otherwise A[sub]i,j[/sub] = 0. It is guaranteed that the given relationship is a tournament, that is, A[sub]i,i[/sub]= 0, A[sub]i,j[/sub] ≠ A[sub]j,i[/sub](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.
 

 

Sample Input
2 5 00100 10000 01001 11101 11000 5 01111 00000 01000 01100 01110
 

 

Sample Output
Case #1: Yes Case #2: No
代码:
 
 
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 using namespace std;
 5 const int MAXN=2010;
 6 int map[MAXN][MAXN];
 7 int que[MAXN],flot,N,tot=0;
 8 char c[MAXN][MAXN];
 9 queue<int>dl;
10 void topsort(){
11     for(int i=1;i<=N;i++)
12         if(!que[i])dl.push(i);
13         //printf("%d",dl.size());
14         //puts("asfaf");
15     while(!dl.empty()){
16         int k=dl.front();
17         flot++;
18         dl.pop();
19         que[k]=-1;
20        // printf("%d",dl.size());
21         for(int j=1;j<=N;j++){
22             if(map[k][j])que[j]--;
23             if(!que[j])dl.push(j);
24         }
25     }
26    // puts("asfaf");
27     if(flot==N)printf("Case #%d: No\n",tot);
28     else printf("Case #%d: Yes\n",tot);
29 }
30 void initial(){
31     memset(que,0,sizeof(que));
32     while(!dl.empty()){
33         dl.pop();
34     }
35     flot=0;
36 }
37 int main(){
38     int T;
39     scanf("%d",&T);
40     while(T--){
41             tot++;
42             initial();
43         scanf("%d",&N);
44         //puts("asfaf");
45         //printf("%d\n",N);
46         for(int i=0;i<N;i++)scanf("%s",c[i]);
47         for(int i=1;i<=N;i++){
48             for(int j=1;j<=N;j++){
49             map[i][j]=c[i-1][j-1]-'0';
50                 if(map[i][j])que[j]++;
51             }
52         }
53        // puts("asfaf");
54        /* for(int i=1;i<=N;i++){
55             for(int j=1;j<=N;j++){
56             printf("%d",map[i][j]);
57             }
58                 puts("");
59         }*/
60         //puts("asfaf");
61         topsort();
62     }
63     return 0;
64 }