hdoj 4324 Triangle LOVE 【拓扑】
2015-08-23 15:38
323 查看
Triangle LOVE
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2586 Accepted Submission(s): 1051
[align=left]Problem Description[/align]
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”.
[align=left]Input[/align]
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).
[align=left]Output[/align]
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.
[align=left]Sample Input[/align]
2 5 00100 10000 01001 11101 11000 5 01111 00000 01000 01100 01110
[align=left]Sample Output[/align]
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; }
相关文章推荐
- Dom第六天学习总结
- C/C++中typedef 用法
- Date日期工具类
- Detours3.0 文档翻译
- 黑马程序员-----------C语言基础-----------指针(二)
- XSPA / SSRF 利用脚本
- SpringMVC文件下载与上传
- 打开smb的几个步骤(非开机启动)
- 生成u-boot.bin 的错误
- 快速幂求模
- actionbar教程集锦
- 黑马程序员--Java基础学习(GUI图形化界面)第二十二天
- ZipArchive压缩文件,文件夹以及解压文件和文件夹
- Dom第五天学习总结
- Detours -- Hook API (MessageBoxW)
- Linux 命令
- 洛谷1049 装箱问题 解题报告
- JDBC基础编程总结
- 今天的我好心痛,调了好久的代码却一直没调好,就因为。。。。。。。。。。
- 在已损坏了程序内部状态的 string.exe 中发生了缓冲区溢出。按“中断”以调试程序,或按“继续”以终止程序。