zoukankan      html  css  js  c++  java
  • pku 2492 A Bug's Life

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

    方法一:

    用mark数组标记如果mark[x]%2==mark[y]%2那么xy就是同性的

    View Code
    #include<stdio.h>
    int father[2002],mark[2002];
    int find(int x)
    {
    int i=x;
    int j=father[x];
    if(x!=father[x])
    father[x]
    =find(father[x]);
    mark[x]
    =(mark[x]+mark[j])%2;////////////x与祖先的关系是由x与父节点的关系和父节点和祖先的关系决定的
    while(i!=father[x])
    {
    j
    =father[i];
    father[i]
    =father[x];
    i
    =j;
    }
    return father[x];
    }

    void merge(int x,int y)
    {
    int fx=find(x);
    int fy=find(y);
    father[fx]
    =fy;
    mark[fx]
    =(mark[y]-mark[x]+1)%2;//r[x]与r[y]相对于新的根节点必须相差1个等级,因为他们不是gay
    }

    int main()
    {
    int t,i,k,n,m,x,y,flag;
    scanf(
    "%d",&t);
    for(k=1;k<=t;k++)
    {
    scanf(
    "%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
    father[i]
    =i;
    mark[i]
    =0;
    }
    flag
    =0;
    while(m--)
    {
    scanf(
    "%d%d",&x,&y);
    if(flag)
    continue;
    if(find(x)==find(y))
    {
    if(mark[x]%2==mark[y]%2)
    flag
    =1;
    }
    else
    merge(x,y);
    }
    printf(
    "Scenario #%d:\n",k);
    if(flag==1)
    printf(
    "Suspicious bugs found!\n");
    else
    printf(
    "No suspicious bugs found!\n");
    printf(
    "\n");
    }
    return 0;
    }

      

    方法二:   

    用other[x]表示x的另一半是谁。那么就可以把同性的从放在一棵树里,不同性的虫在两棵树中。当两只不同性的虫出现在一棵树中就出现了同性恋

         

    View Code
    #include<stdio.h>
    int set[2001],other[2001];
    int find(int x)
    {
    if(x==set[x])
    return x;
    set[x]=find(set[x]);
    return set[x];
    }

    void merge(int x,int y)
    {
    int fx=find(x);
    int fy=find(y);
    set[fx]=fy;
    }

    int main()
    {
    int t,n,m,i,x,y,fx,fy,mark,d;
    scanf(
    "%d\n",&t);
    d
    =0;
    while(t--)
    {
    d
    ++;
    scanf(
    "%d%d",&n,&m);
    for(i=0;i<n+1;i++)
    {
    set[i]=i;
    other[i]
    =0;
    }
    mark
    =0;
    while(m--)
    {
    scanf(
    "%d%d",&x,&y);
    if(!mark)
    {
    fx
    =find(x);
    fy
    =find(y);
    if(fx==fy)
    mark
    =1;
    else
    {
    if(other[x])
    {
    merge(other[x],y);
    }
    else if(other[y])
    {
    merge(other[y],x);
    }
    else
    {
    other[x]
    =y;
    other[y]
    =x;
    }
    }
    }
    }
    printf(
    "Scenario #%d:\n",d);
    if(mark)
    printf(
    "Suspicious bugs found!\n");
    else
    printf(
    "No suspicious bugs found!\n");
    printf(
    "\n");
    }
    return 0;
    }

      

  • 相关阅读:
    Linux C多线程实现生产者消费者
    数据库视图创建学习
    jsp生成好看的验证码
    每日英语
    ES6学习笔记(一)——let和const
    dataTables的导出Excel功能
    jquery生成二维码图片
    angular2表单初体验
    echarts系列之动态加载数据
    js刷新页面方法
  • 原文地址:https://www.cnblogs.com/lujiacheng/p/2113931.html
Copyright © 2011-2022 走看看