Luogu P1726 上白泽慧音

Luogu P1726 上白泽慧音


tarjan强联通裸题,可以当模板用
记录一下自己容易错或忘的几个地方(注释)

#include<cstdio>
#include<cstring>

int n,m,sum=0,top=0,maxx,len,a[50010],tot;
struct nod1{int x,y,next;}b[100010];
int first[100100],z[100100],dfn[100100],qlt[100100],sy[100100],low[100100];

int minn(int x,int y)
{
    return x<y?x:y;
}

int ins(int x,int y)
{
    len++;
    b[len].x=x;
    b[len].y=y;
    b[len].next=first[x];
    first[x]=len;
}

int tarjan(int x)
{
    tot++;
    dfn[x]=low[x]=tot;
    top++;//top是栈内元素的个数
    z[top]=x;
    a[x]=1;
    //分清top和tot 
    for(int i=first[x];i;i=b[i].next)
    {
        int y=b[i].y;
        if(dfn[y]==0)
        {
            tarjan(y);
            low[x]=minn(low[x],low[y]);
            //这里取minn的是low[x]和low[y] 
        }
        else
        {
            if(a[y]==1)
                low[x]=minn(low[x],dfn[y]);
            //这里是low[x]和dfn[y] 
        }
    }
    if(dfn[x]==low[x])
    {
        int y;
        sum++;
        do
        {
            y=z[top];
            top--;
            a[y]=0;
            sy[y]=sum;
            qlt[sum]++;
        }while(x!=y);
    }
}

int main()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int x,y,t;
        scanf("%d %d %d",&x,&y,&t);
        if(t==1)ins(x,y);
        if(t==2)ins(x,y),ins(y,x);
    }
    for(int i=1;i<=n;i++)
    {
        if(dfn[i]==0)tarjan(i);
    }
    for(int i=1;i<=sum;i++)
    {
        if(qlt[i]>maxx)maxx=i;
    }
    printf("%d\n",qlt[maxx]);
    for(int i=1;i<=n;i++)
    {
        if(sy[i]==maxx)
            printf("%d ",i);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42142540/article/details/80238276