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;
    }


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

  • 相关阅读:
    LeetCode15 3Sum
    LeetCode10 Regular Expression Matching
    LeetCode20 Valid Parentheses
    LeetCode21 Merge Two Sorted Lists
    LeetCode13 Roman to Integer
    LeetCode12 Integer to Roman
    LeetCode11 Container With Most Water
    LeetCode19 Remove Nth Node From End of List
    LeetCode14 Longest Common Prefix
    LeetCode9 Palindrome Number
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4752601.html
Copyright © 2011-2022 走看看