tema:
análisis:
El uso de un problema disjuntos-conjunto se resuelve determinando la eliminación de uno de los conectividad de la ciudad antes y después del sorteo, si una alerta
antes y después de cada captura de una ciudad, encontrar la raíz de los números ans, capturó la ciudad, marcando el ciudad, entonces la ciudad de no marcado disjuntos-sET para hacerlo de nuevo, un nodo raíz se determina en este momento un cnt total de, si cnt es igual a aNS, que se describe en este momento de modo que no se produce cambio conectividad ciudad daño, si cnt <ans descripción, en esta ciudad en ruinas es una ciudad aislada, no se alarma, en cnt> ans Descripción destruido la conectividad original, tenemos que hacer sonar la alarma.
código:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 505;
int root[MAXN],n,m,k,ans;
bool vis[MAXN];
struct node
{
int x,y;
}no[5005];
int getr(int x)
{
if(root[x] == x) return x;
else return root[x] = getr(root[x]);
}
void Union(int x,int y)
{
int xx = getr(x);
int yy = getr(y);
if(xx != yy)
root[xx] = yy;
}
int main()
{
int city;
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i)
root[i] = i;
for(int i=1;i<=m;++i)
{
scanf("%d%d",&no[i].x,&no[i].y);
Union(no[i].x,no[i].y);
}
for(int i=0;i<n;++i)
if(root[i]==i) ans++;
scanf("%d",&k);
while(k--)
{
int cnt = 0;
scanf("%d",&city);
vis[city] = true;
for(int i=0;i<n;++i)
root[i] = i;
for(int i=1;i<=m;++i)
if(!vis[no[i].x] && !vis[no[i].y])
Union(no[i].x,no[i].y);
for(int i=0;i<n;++i)
if(!vis[i]&&root[i]==i) cnt++;
if(cnt <= ans)
printf("City %d is lost.\n",city);
else
printf("Red Alert: City %d is lost!\n",city);
ans = cnt;
if(ans == 0)
{
printf("Game Over.\n");
return 0;
}
}
return 0;
}