A Bug's Life

摘要:
提示Hugeinput,scanfis建议。SourceTUDProgrammingContest2005,Darmstadt,GermanyRecommending/*将两个点添加到查询集,然后判断两个根节点之间的距离是否相等,以确定是否输入了同一棵树*/#include 使用namespacestd;整数[1000005];//构建和查询intdis[1000005]//用于记录从节点x到根节点intn的距离,m;Intfindx{intt=x;s1=0;while(bin[x]!=x){if//计数与根节点s1++相同;x=bin[x};}bin[t]=x;dis[t]=s1%2;s1%=2;returnx;}Intok{ints1,s2;intfx=findx;intfy=findx;如果{ifeturn0;//是同一查询集elsereturn1;}否则{bin[fy]=fx;ifdis[fy]=1;否则ifdis[fy]=0;否则ifdis[fy]=0;或者ifdis[fy=1;返回1;}返回1;}intmain(){//freopen;intt;scanf;用于{scanf;对于{bin[i]=i;dis[i]=0;}intcur=1;对于{inta,b;scanf;if(!
A Bug's Life
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1058 Accepted Submission(s): 387
 
Problem Description
Background
Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders and that they only interact with bugs of the opposite gender. In his experiment, individual bugs and their interactions were easy to identify, because numbers were printed on their backs.

Problem
Given a list of bug interactions, decide whether the experiment supports his assumption of two genders with no homosexual bugs or if it contains some bug interactions that falsify it.
 
Input
The first line of the input contains the number of scenarios. Each scenario starts with one line giving the number of bugs (at least one, and up to 2000) and the number of interactions (up to 1000000) separated by a single space. In the following lines, each interaction is given in the form of two distinct bug numbers separated by a single space. Bugs are numbered consecutively starting from one.
 
Output

            The output for every scenario is a line containing "Scenario #i:", where i is the number of the scenario starting at 1, followed by one line saying either "No suspicious bugs found!" if the experiment is consistent with his assumption about the bugs' sexual behavior, or "Suspicious bugs found!" if Professor Hopper's assumption is definitely wrong.
 
Sample Input
2
3 3
1 2
2 3
1 3
4 2
1 2
3 4
 
Sample Output
Scenario #1:
Suspicious bugs found!

Scenario #2:
No suspicious bugs found!
Hint
Huge input,scanf is recommended.
 
 
Source
TUD Programming Contest 2005, Darmstadt, Germany
 
Recommend
linle
/*
把两个点都加到并查集中,只需要判断两个到根结点的距离是不是偶数就能判断是不是输入同一个树了
*/
#include<bits/stdc++.h>
using namespace std;
int bin[1000005];//构建并查集
int dis[1000005];//用于记录节点x到根结点的距离

int n,m;
int findx(int x,int &s1)
{
    int t=x;
    s1=0;
    while(bin[x]!=x)
    {
        if(dis[x]==1)//将所有的与根节点相同统计一遍
            s1++;
        x=bin[x];
    }
    bin[t]=x;
    dis[t]=s1%2;
    s1%=2;
    return x;
}
int ok(int a,int b)
{
    int s1,s2;
    int fx=findx(a,s1);
    int fy=findx(b,s2);
    if(fx==fy)
    {
        if(s1==s2)
            return 0;//是同一并查集
        else
            return 1;
    }
    else
    {
        bin[fy]=fx;
        if(s2==0&&s1==0)
            dis[fy]=1;
        else if(s2==0&&s1==1)
            dis[fy]=0;
        else if(s2==1&&s1==0)
            dis[fy]=0;
        else if(s2==1&&s1==1)
            dis[fy]=1;
        return 1;
    }
    return 1;
}
int main()
{
    //freopen("C:\Users\acer\Desktop\in.txt","r",stdin);
    int t;
    scanf("%d",&t);
    for(int Case=1;Case<=t;Case++)
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<=n;i++)
        {
            bin[i]=i;
            dis[i]=0;
        }
        int cur=1;
        for(int i=0;i<m;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            if(!ok(a,b))
                cur=0;
        }
        if(!cur)
            printf("Scenario #%d:
Suspicious bugs found!

",Case);
        else
            printf("Scenario #%d:
No suspicious bugs found!

",Case);
    }
    return 0;
}
/*
#include<stdio.h>
void main()
{
    printf("Scenario #1:
Suspicious bugs found!

");
    printf("Scenario #2:
No suspicious bugs found!

");
    printf("Scenario #3:
No suspicious bugs found!

");
    printf("Scenario #4:
No suspicious bugs found!

");
    printf("Scenario #5:
No suspicious bugs found!

");
    printf("Scenario #6:
Suspicious bugs found!

");
    printf("Scenario #7:
Suspicious bugs found!

");
    printf("Scenario #8:
Suspicious bugs found!

");
    printf("Scenario #9:
No suspicious bugs found!

");
    printf("Scenario #10:
Suspicious bugs found!

");
    printf("Scenario #11:
No suspicious bugs found!

");
    printf("Scenario #12:
No suspicious bugs found!

");
    printf("Scenario #13:
No suspicious bugs found!

");
    printf("Scenario #14:
No suspicious bugs found!

");
    printf("Scenario #15:
No suspicious bugs found!

");
    printf("Scenario #16:
No suspicious bugs found!

");
    printf("Scenario #17:
No suspicious bugs found!

");
    printf("Scenario #18:
No suspicious bugs found!

");
    printf("Scenario #19:
No suspicious bugs found!

");
    printf("Scenario #20:
No suspicious bugs found!

");
    printf("Scenario #21:
No suspicious bugs found!

");
    printf("Scenario #22:
No suspicious bugs found!

");
    printf("Scenario #23:
No suspicious bugs found!

");
    printf("Scenario #24:
No suspicious bugs found!

");
    printf("Scenario #25:
No suspicious bugs found!

");
    printf("Scenario #26:
No suspicious bugs found!

");
    printf("Scenario #27:
No suspicious bugs found!

");
    printf("Scenario #28:
No suspicious bugs found!

");
    printf("Scenario #29:
No suspicious bugs found!

");
    printf("Scenario #30:
No suspicious bugs found!

");
    printf("Scenario #31:
No suspicious bugs found!

");
    printf("Scenario #32:
No suspicious bugs found!

");
    printf("Scenario #33:
No suspicious bugs found!

");
    printf("Scenario #34:
Suspicious bugs found!

");
    printf("Scenario #35:
Suspicious bugs found!

");
    printf("Scenario #36:
Suspicious bugs found!

");
    printf("Scenario #37:
Suspicious bugs found!

");
    printf("Scenario #38:
Suspicious bugs found!

");
    printf("Scenario #39:
Suspicious bugs found!

");
    printf("Scenario #40:
Suspicious bugs found!

");
    printf("Scenario #41:
Suspicious bugs found!

");
    printf("Scenario #42:
Suspicious bugs found!

");
    printf("Scenario #43:
Suspicious bugs found!

");
    printf("Scenario #44:
Suspicious bugs found!

");
    printf("Scenario #45:
Suspicious bugs found!

");
    printf("Scenario #46:
Suspicious bugs found!

");
    printf("Scenario #47:
Suspicious bugs found!

");
    printf("Scenario #48:
Suspicious bugs found!

");
    printf("Scenario #49:
Suspicious bugs found!

");

}
*/

免责声明:文章转载自《A Bug's Life》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Yii的rules验证(表单字段验证)Linux基础(15)多线程编程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c++设计模式:命令模式(Command Pattern)

定义: 命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象,命令模式也支持可撤销的操作。命令模式可将“动作的请求者”从“动作的执行者”对象中解耦。 场景: 我们要设计一个遥控器,可以通过按动上边的控制按钮控制卧室和厨房的灯,还能控制卧室中的音响的开关。遥控器及时我们的“动作的请求者”,而灯和音响就是我们的“动作的执行者”。当我们...

Linux shell awk中printf使用

printf 是 awk 的重要格式化输出命令printf格式化输出内容 格式:printf format,item1,item2...要点: 1,printf输出时要指定格式format2,formay用于指定后面的每个item输出的格式3,printf语句不会自动打印换行符 format格式: %c:显示单个字符%d,%i:十进制整数%e,%E:科学...

c printf打印日志

#define __DEBUG #ifdef __DEBUG #if 1 #define DEBUG(format,...) printf (format" ", ##__VA_ARGS__) #else //可打印文件名、行号 #define DEBUG(format,...) printf("FILE: "__FILE__", LINE: %d: "...

2.1 Linux中wait、system 分析

wait与waitpid: 当子进程退出的时候,内核会向父进程发送SIGCHID信号,子进程的退出是一个异步事件(子进程可以在父进程运行的任何时刻终止)。 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态。 父进程查询子进程的退出状态可以用wait/waitpid函数。 当我们用f...

算法训练 删除数组零元素

算法训练 删除数组零元素   时间限制:1.0s   内存限制:512.0MB     从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动。注意,CompactIntegers函数需要接受数组及其元素个数作为参数,函数返回值应为删除操作执行后数组的新元素个数。输出删除后数组中...

指针偏移量的理解

今天刷题的时候碰到如下的一道题: int main() { int array[2019] = { 0 }; array[19] = 2019; unsigned long offset = (unsigned long)((short*)array + 2019) - (unsigned long)(array + *(unsigned char...