http://acm.hdu.edu.cn/showproblem.php?pid=4324

Triangle LOVE

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 5523    Accepted Submission(s): 2121

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

Author

BJTU

Source

2012 Multi-University Training Contest 3

Recommend

zhoujiaqi2010

思路

裸的拓扑排序模板题。

判断一个序列是否具有“三角恋”,其实就是利用拓扑排序判断是否有环路?

注意

1、图是读的邻接矩阵,建的。

2、每行不能读scanf("%d",&n),需要读字符串,因为输入样例中每一行没有空格。

AC Code

#include <iostream>
#include <queue>
#include <stack> 
#include <vector>
#include <cstdio>
#include <cstring>
using namespace std;
const int nmax=2010;
int G[nmax][nmax];
int inDegree[nmax];
int n;//点数、边数都是n 
 
bool toposort(){
	int num=0;
	queue<int>q;
	while(!q.empty()) q.pop();
	for(int i=0;i<n;i++){
		if(inDegree[i]==0){
			q.push(i);
		}
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		num++;
		for(int v=0;v<n;v++){
			if(G[u][v]!=0){
				inDegree[v]--;
				if(inDegree[v]==0){
					q.push(v);
				}
			}
		}
	}
	if(num==n)  return true;
	else return false;
}
 
int main(int argc, char** argv) {
	int t; 
	int cnt=0;
	scanf("%d",&t);
	while(t--){
		cnt++;
		scanf("%d",&n); 
		memset(inDegree,0,sizeof(inDegree));
		memset(G,0,sizeof(G));

		for(int i=0;i<n;i++){
			char s[nmax];
			scanf("%s",s);
			for(int j=0;j<n;j++){
				//scanf("%d",&G[i][j]);//不能读数,因为一行之间没有空格 
				if(s[j]=='1'){
					G[i][j]=1;
					inDegree[j]++;
				}
			}
		}
		
		bool flag=toposort();
		if(flag){//无环,无三角恋 
			printf("Case #%d: No\n",cnt);
		}
		else{//有环,有三角恋 
			printf("Case #%d: Yes\n",cnt); 
		}
	}
	return 0;
}