HDOJ4324 Triangle LOVE --- 拓扑排序

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

题解：

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#define MAXN 2010
using namespace std;
int n;
vector<int> vec[MAXN];
queue<int> q;
char ch[MAXN];
int degree[MAXN]; // 存度数
// 初始化
void Init() {
memset(degree,0,sizeof(degree));
while(!q.empty()) q.pop();
for(int i = 1;i <= n;i++) vec[i].clear();
}

// 拓扑排序判环
bool TopoLogical() {
for(int i = 1;i <= n;i++) {
if(degree[i] == 0) {
q.push(i);
}
}
int cnt = 0;// 拓扑排序的节点数
int top;
int size;
while(!q.empty()) {
top = q.front();
q.pop();
cnt++;
size = vec[top].size();
for(int i = 0;i < size;i++) {
degree[vec[top][i]]--;
if(degree[vec[top][i]] == 0) {
q.push(vec[top][i]);
}
}
}
if(cnt != n) {
// 有环
return true;
}
return false;
}

int main()
{
int t;
int Case = 1;
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
Init();
int len;
for(int i = 1;i <= n;i++) {
scanf("%s",ch+1);
len = strlen(ch+1);
for(int j = 1;j <= len;j++) {
if(ch[j] == '1') {
vec[i].push_back(j);
degree[j]++;
}
}
}
bool flag = TopoLogical();// 有环标记
printf("Case #%d: ",Case++);
if(flag == true) {
printf("Yes\n");
} else {
printf("No\n");
}

}

return 0;
} 

• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120