POJ-2492 A Bug's Life Expansión y colección de preguntas de plantilla

Enlace de tema

POJ-2492

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",_);
		}
	}

Supongo que te gusta

Origin blog.csdn.net/TheSunspot/article/details/108046328
Recomendado
Clasificación