HDU 4324 Triangle LOVE【拓扑判断有无闭环】

来源:互联网 发布:java和net哪个比较好 编辑:程序博客网 时间:2024/05/29 14:21

Triangle LOVE

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other)
Total Submission(s) : 22   Accepted Submission(s) : 14

Font: Times New Roman | Verdana | Georgia

Font Size:  

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

25001001000001001111011100050111100000010000110001110

Sample Output

Case #1: YesCase #2: No
利用拓扑判断有无闭环(不是完全闭环,只要有两个以上构成就可以了),条件:入读不为零!!!
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<climits>#include<string>#include<queue>#include<stack>#include<set>#include<vector>#include<map>#include<algorithm>using namespace std;#define rep(i,j,k)for(i=j;i<k;i++)#define per(i,j,k)for(i=j;i>k;i--)#define MS(x,y)memset(x,y,sizeof(x))typedef long long LL;const int INF =0x7FFFFFFF;const int low(int x){return x&-x;}const int M=2005;char mp[M][M];int dis[M];int i,j,k,n,m,t,r;bool flag;void Topo(){    rep(i,0,n){      rep(j,0,n)          {if(!dis[j])break;}      if(j==n){flag=1;break;}      else {        dis[j]--;        rep(r,0,n)        if(mp[j][r]=='1')dis[r]--;      }    }}int main(){    scanf("%d",&t);    rep(k,1,t+1)    {        scanf("%d",&n);        MS(dis,0);        rep(i,0,n){         scanf("%s",mp[i]);          rep(j,0,n){          if(mp[i][j]=='1')            dis[j]++;          }        }        flag=0;        Topo();        if(flag)printf("Case #%d: Yes\n",k);        else printf("Case #%d: No\n",k);    }    return 0;}


0 0
原创粉丝点击