P1726 上白泽慧音

P1726 上白泽慧音

缩点的模板。

因为数据范围很小,所以对于输出方案的判断就可以很水。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>line[5010];
int dfn[5010],low[5010],tim;
int belong[5010],cnt;
int num[5010],Max;
int stack[100000],top;
bool insta[5010];
int n,m;
void tarjan(int now)
{
    dfn[now]=low[now]=++tim;
    stack[++top]=now;
    insta[now]=true;
    for(int i=0;i<line[now].size();i++)
    {
        int nxt=line[now][i];
        if(!dfn[nxt])
        {
            tarjan(nxt);
            if(low[nxt]<low[now])
                low[now]=low[nxt];
        }
        else
            if(insta[nxt]&&dfn[nxt]<low[now])
                low[now]=dfn[nxt];
    }
    if(dfn[now]==low[now])
    {
        int c=0;
        cnt+=1;
        int pas;
        do
        {
            pas=stack[top--];
            insta[pas]=false;
            belong[pas]=cnt;
            c+=1;
        }while(pas!=now);
        num[cnt]=c;
        if(!Max)
        {
            Max=cnt;
            return ;
        }
        if(num[Max]==num[cnt])
        {
            for(int i=1;i<=n;i++)
            {
                if(belong[i]==Max)
                    return ;
                if(belong[i]==cnt)
                {
                    Max=cnt;
                    return;
                }
            }
        }
        if(num[Max]<num[cnt])
        {
            Max=cnt;
            return;
        }
    }
    return ;
}
int main()
{
    scanf("%d%d",&n,&m);
    int a,b,t;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&t);
        if(t==1)
            line[a].push_back(b);
        else
            line[a].push_back(b),line[b].push_back(a);
    }
    for(int i=1;i<=n;i++)
        if(!belong[i])
            tarjan(i);
    printf("%d\n",num[Max]);
    for(int i=1;i<=n;i++)
        if(belong[i]==Max)
            printf("%d ",i);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Lance1ot/p/9069358.html