hdoj 4324 Triangle LOVE 【拓扑排序判断是否存在可行解】
2015-08-14 16:04
531 查看
Triangle LOVE
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 3509 Accepted Submission(s): 1364
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喜欢C,C喜欢A。
大致题意:给你一个N*N的矩阵,A[i][j] = 1表示第i个人喜欢第j个人,为0时表示不喜欢。问你N个人里面是否存在三角恋关系。
思路:直接正向拓扑判断可行解即可。
AC代码:
#include <cstdio> #include <cstring> #include <queue> #include <vector> #include <algorithm> #define MAXN 2000+10 using namespace std; vector<int> G[MAXN]; int in[MAXN]; int N; int k = 1; void init() { for(int i = 1; i <= N; i++) G[i].clear(), in[i] = 0; } void getMap() { char str[2100]; for(int i = 1; i <= N; i++) { scanf("%s", str); for(int j = 0; j < N; j++) { if(str[j] > '0') G[i].push_back(j+1), in[j+1]++; } } } void solve() { queue<int> Q; for(int i = 1; i <= N; i++) if(in[i] == 0) Q.push(i); int num = 0; while(!Q.empty()) { int u = Q.front(); Q.pop(); num++; for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if(--in[v] == 0) Q.push(v); } } printf("Case #%d: ", k++); if(num != N)//存在 printf("Yes\n"); else printf("No\n"); } int main() { int t; scanf("%d", &t); while(t--) { scanf("%d", &N); init(); getMap(); solve(); } return 0; }
相关文章推荐
- 1<<n 和 n<<1
- 前端设计之特效表单
- Java关键字this、super使用总结
- java设计模式之二 —— 装饰者模式整理
- grunt uglify
- 让.net程序自动运行在管理员权限下
- Objective-C:内存管理的小结
- 网络安全开发包介绍
- Java关键字this、super使用总结
- 【无线】11na_ht40,11na_ht40plus,11na_ht40minus的意思
- 昭和天皇の「玉音放送」 原文と現代語訳
- 数据库连接池的实现及原理
- Nim HDU2975
- C++Primer 【笔记】文本查询程序 TextQuery
- C#基数样条曲线的模拟实现(对应Graphics的DrawCurve)
- gcc中函数或者变量的weak属性
- Android FragmentManage FragmentTransaction介绍(二)
- maven安装第三方jar到本地资源库
- nodejs+nginx+mongdb+redis安装学习笔记(之nodejs安装)
- 常用DOS命令