题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4324
题目:
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
题解:题目中给出A不爱B,那么B必须爱A。判断有没有三角恋关系,即A爱B,B爱C,C爱A。其实只要判断有没有环就可以了(因为只要有环,并且A和B之间一定有关系,那么一定能找到三角环)。注意这题用scanf一个一个字符输入会超时...
1 #include <stack> 2 #include <queue> 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 #define FAST_IO ios::sync_with_stdio(false) 7 using namespace std; 8 9 const int N=2000+10; 10 int t,n,cnt; 11 int in[N]; 12 char s[N][N]; 13 vector <int> E[N]; 14 priority_queue <int> Q; 15 16 void toposort(){ 17 for(int i=1;i<=n;i++) if(!in[i]) Q.push(i); 18 while(!Q.empty()){ 19 int u=Q.top();Q.pop(); 20 cnt++; 21 for(int j=0;j<E[u].size();j++){ 22 int v=E[u][j]; 23 in[v]--; 24 if(in[v]==0) Q.push(v); 25 } 26 } 27 } 28 29 int main(){ 30 FAST_IO; 31 cin>>t; 32 for(int k=1;k<=t;k++){ 33 cnt=0; 34 memset(in,0,sizeof(in)); 35 for(int i=0;i<N;i++) E[i].clear(); 36 cin>>n; 37 for(int i=1;i<=n;i++){ 38 E[i].clear(); 39 for(int j=1;j<=n;j++){ 40 cin>>s[i][j]; 41 if(s[i][j]==‘1‘){ 42 E[i].push_back(j); 43 in[j]++; 44 } 45 } 46 } 47 toposort(); 48 49 if(cnt==n) cout<<"Case #"<<k<<": No"<<endl; 50 else cout<<"Case #"<<k<<": Yes"<<endl; 51 } 52 return 0; 53 }