zoukankan      html  css  js  c++  java
  • hdoj 4324 Triangle LOVE 【拓扑】

    Triangle LOVE

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


    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


    题意:给出你全部人的关系。然后让你推断一下是否存在三角恋或多角恋。

    分析:我们能够依据关系建一个有向图,假如A喜欢B那么就让A指向B。假如存在三角恋或多角恋那么肯定会形成一个环,我选择用拓扑排序,假设形成环的话肯定不会把全部的数都排序。

    注意:用链式前向星的话,边的数组要开到2000*1999之上。。RE了好几次。

    心得: 比赛的时候没有想到拓扑。仅仅是想到了并查集。左后还是没有做出来。

    并查集能够推断一棵树是不是成环,拓扑才干够推断一个图是不是成环。

    代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    #define M 2005
    struct node{
    	int to, next;
    }s[20000005];
    int in[M], head[M], n, tot, queue[M];
    char map[M][M];
    void getmap(int a, int b){
    	s[tot].to = b;
    	in[b]++;
    	s[tot].next = head[a];
    	head[a] = tot++;
    }
    int toposort(){
    	bool vis[M];
    	memset(vis, false, sizeof(vis));
    	int i, j, iq = 0;
    	for(i = 0; i < n; i ++){
    		if(!in[i]){
    			queue[iq++] = i;
    			vis[i] = 1;
    		}
    	}
    	for(i = 0; i < iq; i++){
    		int temp = head[queue[i]];
    		for(j = temp; j != -1; j = s[j].next){
    			 if(!(--in[s[j].to])){
    				queue[iq++] = s[j].to;
    			}
    		}
    	}
    	if(iq < n) return 1;
    	else return 0;
    }
    int main(){
    	int t, v = 1;
    	scanf("%d", &t);
    	while(t --){
    		memset(in, 0, sizeof(in));
    		memset(head, -1, sizeof(head));
    		tot = 0;
    		scanf("%d", &n);
    		int i, j, flag;
    		for(i = 0; i < n; i ++){
    			scanf("%s", map[i]);
    			for(j = 0; j < n; j ++){
    				if(map[i][j] == '1'){
    					getmap(i, j);
    				}
    			}
    		}
    		printf("Case #%d: ", v++);
    		flag = toposort();
    		if(flag)  printf("Yes
    ");
    		else printf("No
    ");
    	}
    	return 0;
    }


    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    1066 Bash 游戏
    1070 Bash 游戏 V4
    codevs 2928 你缺什么
    分块、线段树练习
    Father Christmas flymouse
    codevs 2494 Vani和Cl2捉迷藏
    codevs 2144 砝码称重2
    国王游戏
    codevs 1664 清凉冷水
    2015ACM/ICPC亚洲区沈阳站 Pagodas
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4752601.html
Copyright © 2011-2022 走看看