zoukankan      html  css  js  c++  java
  • hdu

    http://acm.hdu.edu.cn/showproblem.php?pid=1829

    http://poj.org/problem?id=2492

    臭虫有两种性别,并且只有异性相吸,给定n条臭虫(编号1-n)和m对关系,判断是否是出现同性恋的情况。

    这题跟食物链的题类似,这里只有两种关系,关系是同性或者异性。

    对于每只动物创建两个元素  同性或异性,并用这 2×n个元素建立并查集。

    首先判断输入的x和y是否是一个组的。是就flag=1.

    然后,如果x和y是一对,那么合并x和y+n,x+n和y。

     1 #include <cstdio>
     2 const int maxn = 2010;
     3 int par[2*maxn];
     4 
     5 void init(int n)
     6 {
     7     for(int i=1;i<=n;i++)
     8         par[i]=i;
     9 }
    10 
    11 int find(int x)
    12 {
    13     return x==par[x]?x:par[x]=find(par[x]);
    14 }
    15 
    16 void unite(int x,int y)
    17 {
    18     x=find(x);
    19     y=find(y);
    20     if(x!=y) par[x]=y;
    21 }
    22 
    23 int main()
    24 {
    25     //freopen("a.txt","r",stdin);
    26     int t,n,m,a,b,j=1;
    27     scanf("%d",&t);
    28     while(t--)
    29     {
    30         scanf("%d%d",&n,&m);
    31         init(n*2);
    32         bool flag=0;
    33         for(int i=0;i<m;i++)
    34         {
    35             scanf("%d%d",&a,&b);
    36             if(find(a)==find(b)) flag=1;
    37             else
    38             {
    39                 unite(a+n,b);
    40                 unite(a,b+n);
    41             }
    42         }
    43         printf("Scenario #%d:
    ",j++);
    44         if(flag) printf("Suspicious bugs found!
    ");
    45         else printf("No suspicious bugs found!
    ");
    46         printf("
    ");
    47     }
    48     return 0;
    49 }

     http://poj.org/problem?id=1703

     给你两个罪犯,判断他们是否属于同一帮派,输入n个罪犯和m条关系,n个罪犯中至少有一个属于帮派Dragon,有一个属于  帮派Snake,m条关系中A表示询问着两个人是否属于同一帮派,D表示这两个人不属于同一帮派。

    这题思路跟上面一样,但开始wa了几次,对并查集的理解还是不够深。

    定义并查集为:并查集里的元素i-x表示i属于帮派x(这里面有3种关系,要么是同一帮派,要么是不同帮派,要么是不能确定。)同一个并查集的元素同时成立。

    初始化并查集为 2*N,如果i表示属于帮派A,那么i+N表示属于帮派B,输入两个元素不在同一帮派的时候,就合并两个帮派的元素。

    这题跟上面两题一样,都是不确定元素i属于集合A还是集合B,所以要保留所有的可能性。

     1 #include <cstdio>
     2 const int maxn = 100010;
     3 int par[maxn*2];
     4 
     5 void init(int n)
     6 {
     7     for(int i=1;i<=n;i++)
     8     {
     9         par[i]=i;
    10     }
    11 }
    12 
    13 int find(int x)
    14 {
    15     return x==par[x]?x:par[x]=find(par[x]);
    16 }
    17 
    18 void unite(int x,int y)
    19 {
    20     x=find(x);
    21     y=find(y);
    22     if(x!=y)
    23     {
    24         par[x]=y;
    25     }
    26 }
    27 
    28 int main()
    29 {
    30    // freopen("a.txt","r",stdin);
    31     int t,n,m,a,b;
    32     char s[5];
    33     scanf("%d",&t);
    34     while(t--)
    35     {
    36         scanf("%d%d",&n,&m);
    37         init(n*2);
    38         for(int i=0;i<m;i++)
    39         {
    40             scanf("%s%d%d",s,&a,&b);
    41             if(s[0]=='A')
    42             {
    43                 if(find(a)==find(b)) printf("In the same gang.
    ");
    44                 else if(find(a)==find(b+n)) printf("In different gangs.
    ");  //这里开始没想到  唉
    45                 else printf("Not sure yet.
    ");
    46             }
    47             else if(s[0]=='D')
    48             {
    49                 unite(a,b+n);
    50                 unite(a+n,b);
    51             }
    52         }
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    系统维护相关问题
    Python环境维护
    哈希表解决字符串问题
    论文笔记二:《A Tutoral on Spectral Clustering》
    论文笔记之哈希学习比较--《Supervised Hashing with Kernels》《Towards Optimal Binary Code Learning via Ordinal Embedding》《Top Rank Supervised Binary Coding for Visual Search》
    Java中String、StringBuffer、StringBuilder的比较与源 代码分析
    浙大pat1040 Longest Symmetric String(25 分)
    浙大pat1039 Course List for Student(25 分)
    浙大pat---1036 Boys vs Girls (25)
    百炼oj-4151:电影节
  • 原文地址:https://www.cnblogs.com/nowandforever/p/4484782.html
Copyright © 2011-2022 走看看