http://acm.hdu.edu.cn/showproblem.php?pid=4324
Triangle LOVETime 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;
}