Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 894 Accepted Submission(s): 373
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”.
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).
Take the sample output for more details.
//这题做的好奇怪、开始用vector进行邻接存储以某点出发可以到的点
//结果超时,而用for循环(i=1;i<=n;i++)居然187Ms
//网上说官方解题报告用“增量法",表示不知道、唉、见识太少
//这方法是最早想到的、结果一直被自己排除,东搞西搞最后还是回来用dfs
//就是用不恢复标记、判断某2点距离是否相差2且有线相连
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #include <vector> using namespace std; char b[2001][2001]; bool f[2001],flag; int dis[2001],n; void dfs(int df) { if(flag) return; f[df]=1; int i; for(i=1;i<=n;i++) if(b[df][i]=='1') { if(f[i]&&dis[df]==dis[i]+2)//判断是否成3角恋关系 { flag=1; break; } else if(!f[i]) { dis[i]=dis[df]+1; dfs(i); } } } int main() { int t,cnt=1; int i; scanf("%d",&t); while(t--) { scanf("%d",&n); getchar(); for(i=1;i<=n;i++) { f[i]=0; scanf("%s",b[i]+1); } flag=0;dis[1]=0; dfs(1); printf("Case #%d: ",cnt++); if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }