HDU NO.4324 Triangle LOVE(拓扑排序)

来源:互联网 发布:bioeffect蓓欧菲 知乎 编辑:程序博客网 时间:2024/06/18 14:46

题意:

如果A爱B,那么B就一定不爱A  --!.

大致意思是,在图中能不能找到三角环。

原题描述:

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). A i,j = 1 means i-th people loves j-th people, otherwise A i,j = 0. 
It is guaranteed that the given relationship is a tournament, that is, A i,i= 0, A i,j ≠ A j,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
 

思路:

可以吧图中是“1”的坐标构成有向图,然后拓扑排序,如果结果没有拓扑序列即有环也就是存在三角恋 --!

代码:

#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cmath>#include<queue>#include<stack>#include<cstring>#include<string>#include<vector>#include<set>using namespace std;#define X first#define Y secondconst int INF = 0x3f3f3f3f;const int MAX = 3000;int head[MAX], indegree[MAX], que[MAX];int top, n;struct node{    int to, w, next;}edge[MAX * MAX];void add_edge(int u, int v){    edge[top].to = v;    edge[top].next = head[u];    head[u] = top++;}void init(){    top = 0;    memset(head, -1, sizeof(head));    memset(indegree, 0, sizeof(indegree));}bool Topsort(){    int iq = 0;    for(int i = 0; i < n; i++)        if(indegree[i] == 0)            que[iq++] = i;    for(int i = 0; i < iq; i++){        for(int j = head[que[i]]; j != -1; j = edge[j].next){            indegree[edge[j].to]--;            if(indegree[edge[j].to] == 0)                que[iq++] = edge[j].to;        }    }    if(iq < n - 1)        return true;    else        return false;}int main(){    int t, cns = 1;    scanf("%d", &t);    while(t--){        init();        scanf("%d", &n);        char arr[n][n];        for(int i = 0; i < n; i++){            scanf("%s", &arr[i]);            for(int j = 0; j < n; j++){                if(arr[i][j] == '1'){                    add_edge(i, j);                    indegree[j]++;                }            }        }        int res = Topsort();        if(res)            printf("Case #%d: Yes\n", cns++);        else            printf("Case #%d: No\n", cns++);    }    return 0;}


0 0
原创粉丝点击