Enlace de tema
Título
Dadas n gusanos y m relaciones, los gusanos tienen sólo dos sexos. Cada relación te dice que los dos gusanos son del sexo opuesto. ¿Hay datos contradictorios?
Ideas
Cobro de cheques sindicalizados desnudos, con derechos o expansión, uso aquí el cobro de cheques sindicalizados de expansión, se siente mucho más fácil de escribir que con derechos
Abra el doble del espacio, 1-n es el insecto mismo, y n-2n es el individuo del insecto transformado por sexo. Los bichos del mismo conjunto son del mismo sexo. Luego, para cada relación uv, si se encuentra que el nodo ancestro de uv es el mismo, entonces hay un error; de lo contrario, conecte u y v + n, u + n y v.
Si escribe una extensión y comprueba la colección por primera vez, puede hacer la cadena alimentaria después del problema de CA. También escribí la solución
Código
#include<iostream>
#include<cstdio>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
using namespace std;
typedef long long ll;
const int maxn=5000;
const int inf=0x3f3f3f3f;
int fa[maxn];
int tn,n,m;
void init(){
for(int i=0;i<maxn;i++)
fa[i]=i;
}
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void unite(int x,int y){
int fx=find(x),fy=find(y);
if(fx==fy)
return ;
fa[fx]=fy;
}
int main(){
scanf("%d",&tn);
for(int _=1;_<=tn;_++){
scanf("%d%d",&n,&m);
init();
bool bug=0;
while(m--){
int u,v;
scanf("%d%d",&u,&v);
if(bug)
continue;
int fu=find(u),fv=find(v);
if(fu==fv)
bug=1;
else
unite(u,v+n),unite(v,u+n);
}
if(bug)
printf("Scenario #%d:\nSuspicious bugs found!\n\n",_);
else
printf("Scenario #%d:\nNo suspicious bugs found!\n\n",_);
}
}