• HDOJ 1325 并查集


    跟小希的迷宫基本一样,只是此题是有向图,要注意:1无环 2 只有一个入度为0的结点(根结点),

    不存在入度大于1的结点。输入结束条件是两个负数,而不是-1,不然会TLE。

     1 #include<stdio.h>
     2 #define NUM 23
     3 int root[NUM], visit[NUM], lu[NUM];
     4 void init(){
     5     for(int i=0; i<=NUM; i++){
     6         root[i]=i;
     7         visit[i]=0;
     8         lu[i]=0;
     9     }
    10 }
    11 int find(int x){
    12     while(root[x]!=x)
    13         x=root[x];
    14     return x;
    15 }
    16 void merge(int a, int b){
    17     int x=find(a);
    18     int y=find(b);
    19     root[x]=y;
    20 }
    21 int main(){
    22     int a,b,i,flag,count;
    23     init();
    24     flag = 1;//judge
    25     count = 0;//numcase
    26     while(EOF != scanf("%d%d",&a,&b)){
    27         if(a <0 || b < 0)   break;
    28         if(visit[a] == 0)   visit[a] = 1;
    29         if(visit[b] == 0)   visit[b] = 1;
    30         lu[b]++;
    31         //如果是相同的根,会形成环
    32         if(find(a) == find(b) && a != 0 && b != 0 && a != b) flag = 0;
    33         else    merge(a,b);
    34         if(a==0 && b==0){
    35             count++;
    36             int cnt=0;
    37             for(i=1; i<NUM; i++){
    38                 if(visit[i] == 1 && root[i] == i)
    39                     cnt++;
    40                 if(cnt > 1 || lu[i] > 1) //判断是否有2个以上的根 && 不能有入度大于1的点
    41                     flag = 0;
    42             }
    43             if(!flag)
    44                 printf("Case %d is not a tree.
    ",count);
    45             else printf("Case %d is a tree.
    ",count);
    46             init();
    47             flag=1;
    48         }
    49     }
    50     return 0;
    51 }
  • 相关阅读:
    如何检测和删除通过pip安装的Python包?
    tensorflow使用keras
    ubuntu18.04安装tensorflow2.0
    python pip版本的安装与管理
    leetcode 377. 组合总和 Ⅳ
    little tips
    NYOJ 104-最大和
    NYOJ 44-子串和
    NYOJ 15-括号匹配(二)
    leetCode 32. Longest Valid Parentheses
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/3683801.html
Copyright © 2020-2023  润新知