[C ++] henuACM Summer Training Day10 y búsqueda set_topological sort

Proyecto desbloqueado de la pregunta B (HDU 1232)

Una provincia investiga las condiciones del tráfico urbano y obtiene una tabla estadística de las vías urbanas existentes, que enumera las ciudades y pueblos directamente conectados a cada vía. El objetivo del "Proyecto desbloqueado" del Gobierno provincial es permitir el tráfico entre dos ciudades cualesquiera de la provincia (pero no necesariamente conectadas directamente por carreteras, siempre que se pueda acceder a ellas indirectamente por carreteras). Pregunte al menos cuántas carreteras se deben construir.

Entrada

La entrada de prueba contiene varios casos de prueba. La primera línea de cada caso de prueba da dos enteros positivos, que son el número de ciudades N (<1000) y el número de carreteras M; las siguientes líneas M corresponden a M carreteras, y cada línea da un par de enteros positivos, que son El número de dos ciudades conectadas directamente por una carretera. Por simplicidad, las ciudades se numeran del 1 al N.
Nota: Puede haber varias carreteras entre las dos ciudades, lo que significa que la entrada de
3 3
1 2
1 2
2 1
también es legal.
Cuando N es 0, la entrada finaliza y el caso de uso no se procesa.

Salida

Para cada caso de prueba, genere el número mínimo de carreteras que se construirán en una línea.

Entrada de muestra

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

Salida simple

1
0
2
998

Gran entrada, se recomienda scanf.

Ideas para resolver problemas

Con el uso de la búsqueda combinada, cada vez que se conectan dos ciudades, se colocan en un conjunto. Al final, si hay varios conjuntos, habrá algunos menos una carretera que debe repararse.

El código de CA es el siguiente:

#include<iostream>
using namespace std;
const int maxn = 99999;
int parent[maxn];

int findset(int x)
{
    
    
    int tmp;
    if(parent[x] == -1){
    
    
        return x;
    }
    else {
    
    
       parent[x] = findset(parent[x])}
}

int main()
{
    
    
    int n,m;
    int a,b;
    while(cin>>n && n)
    {
    
    
        int ans=0;
        for(int i=1;i<=maxn;++i){
    
    
            parent[i] = -1;
        }
        cin>>m;
        for(int i=0;i<m;++i){
    
    
            cin>>a>>b;
            int roota = findset(a);
            int rootb = findset(b);
            if(roota != rootb){
    
    parent[roota]=rootb;}
        }
        for(int i=1;i<=n;++i){
    
    
            if(parent[i] == -1){
    
    ans++;}
        }
        cout<<ans-1<<endl;
    }
    return 0;
}

```

其中 *findset* 函数的代码可以缩写:

```
int findset(int x) 
{
    
     
    return parent[x] == x ? parent[x] = x:findset(parent[x]); 
} 

Supongo que te gusta

Origin blog.csdn.net/qq_44899247/article/details/97145059
Recomendado
Clasificación