☀L2-013 Alerta roja (25 puntos) [PTA] [Conjunto de verificación combinado]

Es muy importante mantener la conectividad entre ciudades durante la guerra. Esta pregunta requiere que escriba un programa de alarma.Cuando la pérdida de una ciudad hace que el país se divida en múltiples áreas no conectadas, se emitirá una alarma roja. Nota: Si el país no está completamente conectado, se divide en k regiones, y perder una ciudad no cambia la conectividad entre otras ciudades, entonces no emita una alarma.

Formato de entrada:

Ingrese dos números enteros N(0 <  N ≤ 500) y M(≤ 5000) en la primera línea , que son el número de ciudades (la ciudad predeterminada está Nnumerada de 0 a -1) y el número de carreteras que conectan las dos ciudades. En las Mlíneas siguientes , cada línea indica los números de las dos ciudades conectadas por un camino, separadas por un espacio. Después de la información de la ciudad, se proporciona la información capturada, es decir, un número entero positivo Kseguido del Knúmero de la ciudad capturada.

Nota: La entrada garantiza que los números de ciudad dados que se capturan son legales y no repetitivos, pero no garantiza que los canales dados no estén duplicados.

Formato de salida:

Para cada ciudad capturada, si cambia la conectividad de todo el país, imprímalo Red Alert: City k is lost!, donde kes el número de ciudad; de lo contrario, simplemente imprímalo City k is lost.. Si el país pierde su última ciudad, agregue una línea de salida Game Over..

Muestra de entrada:

5 4
0 1
1 3
3 0
0 4
5
1 2 0 4 3

Salida de muestra:

City 1 is lost.
City 2 is lost.
Red Alert: City 0 is lost!
City 4 is lost.
City 3 is lost.
Game Over.

Primero use la búsqueda de unión para encontrar el número inicial de componentes conectados C, y luego vuelva a calcular el número de componentes conectados C1 sin capturar una ciudad (tenga en cuenta que se omiten los bordes de la ciudad capturada), cada vez que C1 se compara con C , y se emite el resultado correspondiente. C1 C tiene 3 situaciones,

1. C1 = C indica que la ciudad capturada está en un anillo y no afectará la conectividad de la imagen original.

2. C1 = C + 1 indica que la ciudad capturada solo está conectada a una ciudad, que es la capa más externa de la figura.

3. C1-C> 1, indica que la ciudad capturada está conectada a al menos dos ciudades. Después de ser capturada, el componente conectado aumentará en al menos 2.

Propenso a errores: 1. Tenga en cuenta que la captura de una ciudad no es para eliminarla, pero no para contar los bordes que conecta.

   2. Cada vez que se compara con el componente conectado anterior antes de que se capture la ciudad, preste atención a actualizar el componente conectado inicial.

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
pair<int,int>p[5500];
int pre[550];
int v[550];
int count(int n)
{
    int c=0;
    for(int i=0;i<n;i++)
    {
        if(v[i]==i)
            c++;
    }
    return c;
}
int find(int root)
{
    if(v[root]==root)
        return root;
    else
        return v[root]=find(v[root]);
}
void Union(int r1,int r2)
{
    int root1=find(r1);
    int root2=find(r2);
    if(root1!=root2)
        v[root1]=root2;
}
int main()
{
    int N,M;
    cin>>N>>M;
    for(int j=0;j<550;j++)
        v[j]=j;
    memset(pre,0,sizeof(pre));
    for(int i=0;i<M;i++)
    {
        cin>>p[i].first>>p[i].second;
        Union(p[i].first,p[i].second);
    }
    int r1=count(N);
    int k;
    cin>>k;
    while(k--)
    {
        int pr;
        cin>>pr;
        pre[pr]=1;
        for(int j=0;j<550;j++)
            v[j]=j;
        for(int j=0;j<M;j++)
        {
            if(pre[p[j].first]==1||pre[p[j].second]==1)
                continue;
            Union(p[j].first,p[j].second);
        }
        int r2=count(N);
        if(r1+1==r2||r1==r2)
            cout<<"City "<<pr<<" is lost."<<endl;
        else
            cout<<"Red Alert: City "<<pr<<" is lost!"<<endl;
        r1=r2;
    }
    r1=count(N);
    if(r1==N)
        cout<<"Game Over."<<endl;
    return 0;
}

 Referencia: https://blog.csdn.net/saber_wtq/article/details/79193625?biz_id=102&utm_term=red alerta & utm_medium = distribuir.pc_search_result.none-task-blog-2 ~ all ~ sobaiduweb ~ default-0-79193625 & spm = 1018.211 .3001.4187

Supongo que te gusta

Origin blog.csdn.net/qq_43660826/article/details/108961351
Recomendado
Clasificación