SP3377

题目简化和分析:

前言:这题目背景真奇怪。

我们可以将每种关系,看成一条边,如果出现奇数边环就不满足。
例如:\(a,b\) 异性 \(a,c\) 异性 \(b,c\)异性 这种情况是不满足的。
相当与一个奇数边环。

所以我们就的考虑如何判断环,我们可以使用二分图染色
如果一条边的两个端点的颜色一致,则是奇数边环。

注意:多组数据应该清空数组啊!((我被坑了

Solution:

#include<bits/stdc++.h>

using namespace std;

int n,m;

const int N=1e6+50;

struct edge{
	int to,next;
}e[N<<1];
int head[N<<1],cnt,col[N<<1];
void add_edge(int u,int v){
	++cnt;
	e[cnt].to=v;
	e[cnt].next=head[u];
	head[u]=cnt;
}


void work()
{
	memset(col,0,sizeof(col));
	memset(head,0,sizeof(head));
	cnt=0;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;++i){
		int u,v;
		scanf("%d%d",&u,&v);
		add_edge(u,v);
		add_edge(v,u);
	}
	bool flag=0;
	queue<int>q;
	int ans=0;
	for(int i=1;i<=n&&!flag;++i){
		if(col[i]) continue;
		q.push(i);
		col[i]=1;
		while(!q.empty()){
			int x=q.front();
			q.pop();
			for(int j=head[x];j;j=e[j].next){
				int y=e[j].to;
				if(col[y]){
					if(col[y]==col[x]){
						flag=1;
						break;
					}
				}else{
					col[y]=3-col[x];
					q.push(y);
				}
			}
		}
	}
	if(flag){
		printf("Suspicious bugs found!\n");
	}else{
		printf("No suspicious bugs found!\n");
	}
}

int main()
{
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;++i){
		printf("Scenario #%d:\n",i);
		work();
	}
	return 0;
}
posted @ 2022-08-06 15:05  RVG  阅读(62)  评论(0)    收藏  举报