hdoj 4324 Triangle LOVE 【拓扑】
Triangle LOVE
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2586 Accepted Submission(s): 1051
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那么就让A指向B。假如存在三角恋或多角恋那么肯定会形成一个环,我选择用拓扑排序,假设形成环的话肯定不会把全部的数都排序。
注意:用链式前向星的话,边的数组要开到2000*1999之上。。RE了好几次。
心得: 比赛的时候没有想到拓扑。仅仅是想到了并查集。左后还是没有做出来。
并查集能够推断一棵树是不是成环,拓扑才干够推断一个图是不是成环。
代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define M 2005 struct node{ int to, next; }s[20000005]; int in[M], head[M], n, tot, queue[M]; char map[M][M]; void getmap(int a, int b){ s[tot].to = b; in[b]++; s[tot].next = head[a]; head[a] = tot++; } int toposort(){ bool vis[M]; memset(vis, false, sizeof(vis)); int i, j, iq = 0; for(i = 0; i < n; i ++){ if(!in[i]){ queue[iq++] = i; vis[i] = 1; } } for(i = 0; i < iq; i++){ int temp = head[queue[i]]; for(j = temp; j != -1; j = s[j].next){ if(!(--in[s[j].to])){ queue[iq++] = s[j].to; } } } if(iq < n) return 1; else return 0; } int main(){ int t, v = 1; scanf("%d", &t); while(t --){ memset(in, 0, sizeof(in)); memset(head, -1, sizeof(head)); tot = 0; scanf("%d", &n); int i, j, flag; for(i = 0; i < n; i ++){ scanf("%s", map[i]); for(j = 0; j < n; j ++){ if(map[i][j] == '1'){ getmap(i, j); } } } printf("Case #%d: ", v++); flag = toposort(); if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }
版权声明:本文博客原创文章。博客,未经同意,不得转载。