VIJOS-P1626 爱在心中

VIJOS-P1626 爱在心中

JDOJ 1588

https://neooj.com/oldoj/problem.php?id=1588

TARJAN求强连通分量的模板题

AC代码

#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,ans,sum;
int tot,to[10001],nxt[10001],head[1001];
int rudu[1001],chudu[1001];
int z[1001],inz[1001],v[1001],deep[1001],low[1001],belong[1001],top,cnt;
int f[1001][1001];
void add(int x,int y)
{
    to[++tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}
void tarjan(int x)
{
    z[++top]=x;
    v[x]=1;
    inz[x]=1;
    deep[x]=low[x]=++cnt;
    for(int i=head[x];i;i=nxt[i])
    {
        int y=to[i];
        if(v[y]==0)
        {
            tarjan(y);
            low[x]=min(low[x],low[y]);
        }
        else if(inz[y]==1)
            low[x]=min(low[x],deep[y]);
    }
    if(deep[x]==low[x])
    {
        ans++;
        int t;
        do
        {
            t=z[top--];
            inz[t]=0;
            f[ans][++f[ans][0]]=t;
            belong[t]=ans;
        }while(t!=x);
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b);
        rudu[b]++;
    }
    for(int i=1;i<=n;i++)
        if(v[i]==0)
            tarjan(i);
    for(int i=1;i<=ans;i++)
        if(f[i][0]!=1)
            sum++;
    printf("%d\n",sum);
    for(int i=1;i<=n;i++)
        for(int j=head[i];j;j=nxt[j])
            if(belong[i]!=belong[to[j]])
                chudu[belong[i]]++;
    sum=0;
    int pos;
    for(int i=1;i<=ans;i++)
        if(chudu[i]==0)
            sum++,pos=i;
    if(sum!=1 || f[pos][0]==1)
        printf("-1");
    else
    {
        int a=f[pos][0];
        f[pos][0]=0;
        sort(f[pos]+1,f[pos]+a+1);
        for(int i=1;i<=a;i++)
            printf("%d ",f[pos][i]);
    }
    return 0;
}

 

posted @ 2019-07-10 11:04  Seaway-Fu  阅读(167)  评论(1编辑  收藏  举报