Búsqueda de anillo-unión de descubrimiento + DFS

Mi nivel es limitado y solo soy para aprender. Si encuentras algún error, gracias por señalar

Enlace de tema: Portal (haz clic en mí)
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí


Idea: Primero use el conjunto de verificación de unión para juzgar si hay un anillo, porque el título es muy claro, al principio solo hay líneas N-1, y ahora hay una línea más para formar un anillo, luego use primero la unión check set para juzgar, una vez que se encuentra que es un anillo, ponga que Uno de los dos puntos es el punto de partida y el otro es el punto final, porque los dos son adyacentes. Son los bordes que unen las dos computadoras que forman el anillo.

Almacenamiento: Aquí usamos la lista de adyacencia para almacenar el borde (implementación de matriz dinámica)
Búsqueda: Debe tenerse en cuenta que dado que la computadora que no está en el anillo también puede tener un borde con la computadora en el anillo, el paso de la función DFS es necesario aquí , porque si inicia Incluso si se encuentra una computadora fuera del anillo , esta ruta se revertirá hasta que se sobrescriba con el número de computadora en el anillo .

Código AC:

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100050

int p[MAXN],vis[MAXN],ans[MAXN];//parent visited answer
int n,a,b;
int s,en;//dfs (start end)
vector<int>e[MAXN];//edge

int f(int x){
    
    return p[x]==-1?x:p[x]=f(p[x]);}//find root and compressed path

void pr(int step)
{
    
    
    sort(ans+1,ans+1+step);
    for(int i=1;i<=step;i++)cout<<ans[i]<<" ";
}

void dfs(int x,int step)
{
    
    
    vis[x]=1;//sign
    ans[step]=x;
    if(x==en){
    
    pr(step);return;}
    for(int i=0;i<e[x].size();i++)
        if(!vis[e[x][i]])dfs(e[x][i],step+1);
}

int main()
{
    
    
    memset(p,-1,sizeof(p));//initialization
    cin>>n;
    while(n--){
    
    
        cin>>a>>b;
        if(f(a)==f(b))s=a,en=b;
        else {
    
    
            p[f(a)]=b;//merge
            e[a].push_back(b);//edge
            e[b].push_back(a);
        }
    }
    dfs(s,1);
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43615816/article/details/114846034
Recomendado
Clasificación