A Bug's Life

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.

题目大意:给出许多虫子的交互,求这些虫子当中是否有gay,比如假设每个虫子交互时都是与异性交互,但是许多数据里面可能会出现问题,比如1 2交互,2 3 交互,所以1 3性别相同,如果再给出1 3交互,就错误了。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int t,n,m,flag,a1,a2;
int f[2010],sum[2010];//f存当前节点的父节点,sum存当前节点到根节点的距离
void init()//初始化数据
{
	for(int i=0;i<=n;i++)	f[i]=i;
	memset(sum,0,sizeof(sum));
	flag=0;
}
int find_root(int x)
{
	if(x!=f[x])
	{
		int temp=f[x];//先记录出这个父节点
		f[x]=find_root(f[x]);//压缩路径
		sum[x]+=sum[temp];//当前到父节点的距离,加上父节点到根节点的距离,就是这个节点到根节点的距离(动态规划的思想)
	}
	return f[x];//最后返回根节点
}
void union_set(int a,int b)
{
	int fa=find_root(a);
	int fb=find_root(b);
	if(fa!=fb)
	{
		f[fa]=fb;
		sum[fa]=sum[b]+1-sum[a];//简单画图即可推出
	}
	else if(sum[a]%2==sum[b]%2)	flag++;//如果根节点相同,判断稻根节点的距离mod2是否相等,如果相等就是gay
}
int main()
{
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		scanf("%d %d",&n,&m);
		init();
		while(m--)
		{
			scanf("%d %d",&a1,&a2);
			union_set(a1,a2);
		}
		cout<<"Scenario #"<<i<<':'<<endl;
		if(flag)	cout<<"Suspicious bugs found!"<<endl<<endl;
		else	cout<<"No suspicious bugs found!"<<endl<<endl;;
	}
	return 0;
}
全部评论

相关推荐

行云流水1971:这份实习简历的优化建议: 结构清晰化:拆分 “校园经历”“实习经历” 板块(当前内容混杂),按 “实习→校园→技能” 逻辑排版,求职意向明确为具体岗位(如 “市场 / 运营实习生”)。 经历具象化:现有描述偏流程,需补充 “动作 + 数据”,比如校园活动 “负责宣传” 可加 “运营公众号发布 5 篇推文,阅读量超 2000+,带动 300 + 人参与”;实习内容补充 “协助完成 XX 任务,效率提升 X%”。 岗位匹配度:锚定目标岗位能力,比如申请运营岗,突出 “内容编辑、活动执行” 相关动作;申请市场岗,强化 “资源对接、数据统计” 细节。 信息精简:删减冗余表述(如重复的 “负责”),用短句分点,比如 “策划校园招聘会:联系 10 + 企业,组织 200 + 学生参与,到场率达 85%”。 技能落地:将 “Office、PS” 绑定经历,比如 “用 Excel 整理活动数据,输出 3 份分析表;用 PS 设计 2 张活动海报”,避免技能单独罗列。 优化后需强化 “经历 - 能力 - 岗位需求” 的关联,让实习 / 校园经历的价值更直观。 若需要进一步优化服务,私信
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务