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;
}

浙公网安备 33010602011771号