HDU 4324 Triangle LOVE(拓扑排序判环)

Posted leonard-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 4324 Triangle LOVE(拓扑排序判环)相关的知识,希望对你有一定的参考价值。

题目链接: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”.
 
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).
 
 
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
 
题解:题目中给出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 }

 

以上是关于HDU 4324 Triangle LOVE(拓扑排序判环)的主要内容,如果未能解决你的问题,请参考以下文章

HDU4324 Triangle LOVE拓扑排序

hdu 4324 Triangle LOVE(拓扑判环)

hdu 4324 Triangle LOVE 拓扑排序

HDU - 4324 Triangle LOVE(拓扑排序)

L - Love Triangle

HDU 4466 Triangle