首页 > 学院 > 开发设计 > 正文

A Bug's Life

2019-11-10 18:42:41
字体:
来源:转载
供稿:网友

A Bug's Life

时间限制:1000 ms  |  内存限制:65535 KB难度:4描述 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.输入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 10000) 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.输出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.样例输入
23 31 22 31 34 21 23 4样例输出
Scenario #1:Suspicious bugs found!Scenario #2:No suspicious bugs found!

解题报告:种类并查集。把性别相同的虫子放在同一个集合,然后每读入一对虫子号,判断它们在不在同一集合,在则同性别,不在则继续。

code

#include<iostream>#include<stdio.h>#include<queue>#include<vector>#include<stack>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const int MAXN = 10005; /*结点数目上限*/int pa[MAXN];    /*pa[x]表示x的父节点*/int rank[MAXN];    /*rank[x]是x的高度的一个上界*/int gender[MAXN];  // 与i性别相反的虫子号/*创建一个单元集*/void make_set(int x){    pa[x] = x;    rank[x] = 0;    gender[x]=0;}/*带路径压缩的查找*/int find_set(int x){    if(x != pa[x]){        pa[x] = find_set(pa[x]);    }    return pa[x];}/*按秩合并x,y所在的集合*/void union_set(int x, int y){    x = find_set(x);    y = find_set(y);    if(rank[x] > rank[y])/*让rank比较高的作为父结点*/    {        pa[y] = x;    }    else    {        pa[x] = y;        if(rank[x] == rank[y])            rank[y]++;    }}int main(){  //  freopen("input.txt","r",stdin);    int t,m,n,k=1;    scanf("%d",&t);    while(t--){        scanf("%d%d",&m,&n);        for(int i=1;i<=m;i++){ //初始化            make_set(i);        }        int a,b,flag=1;        for(int i=0;i<n;i++){            scanf("%d%d",&a,&b);            if(!flag) //结果出来之后也要把数据读完                continue;            if(find_set(a)==find_set(b)){  //判断两个虫子在不在同一个集合                flag=0;                continue;            }            if(gender[a]==0) gender[a]=b; //把性别相同的虫子放在同一个集合里            else union_set(gender[a],b);            if(gender[b]==0) gender[b]=a;            else union_set(gender[b],a);        }        if(k!=1)            printf("/n");        if(flag)            printf("Scenario #%d:/nNo suspicious bugs found!/n",k++);        else            printf("Scenario #%d:/nSuspicious bugs found!/n",k++);    }    return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表