tarjan

#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
struct ss{
    int next,to;
};ss data[200010];
const int inf=1e9+7;
int n,q,timeclock,p,top,cnt,ans,r;
int dfn[200010],low[200010],stack[200010],instack[200010],next[200010],head[200010];
int belong[200010],money[200010],sum[200010],size[200010],rd[200010];
void add(int a,int b)
{
    data[++p].next=head[a];
    data[p].to=b;
    head[a]=p;
}
void tarjan(int a)           
{
    dfn[a]=low[a]=++timeclock;
    instack[a]=1;
    stack[++top]=a;
    for(int i=head[a];i;i=data[i].next)
    {
        int v=data[i].to;
        if(!dfn[v])
        {
            tarjan(v);
            low[a]=min(low[a],low[v]);
        }
        else
        if(instack[v])
        low[a]=min(low[a],dfn[v]);
    }
    if(dfn[a]==low[a])
    {
        cnt++;
        while(stack[top+1]!=a)
        {
            belong[stack[top]]=cnt;
            instack[stack[top]]=0;
            size[cnt]++;
            sum[cnt]=min(sum[cnt],money[stack[top]]);
            top--;
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    money[i]=1e9+7;        
    for(int i=1;i<=n;i++)
    sum[i]=1e9;
    scanf("%d",&q);
    for(int i=1;i<=q;i++)
    {
        int u,mo;
        scanf("%d%d",&u,&mo);
        money[u]=mo;
    }
    scanf("%d",&r);
    for(int i=1;i<=r;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        add(u,v);
    }
    for(int i=1;i<=n;i++)
    if(!dfn[i]&&money[i]!=inf)   
    tarjan(i);
    for(int i=1;i<=n;i++)      
    if(!dfn[i])
    {
        printf("NO
");
        printf("%d
",i);
        return 0;
    }

    for(int i=1;i<=n;i++)
    for(int j=head[i];j;j=data[j].next)
    if(belong[i]!=belong[data[j].to])
    {
        rd[belong[data[j].to]]++;  
    }
    printf("YES
");
    for(int i=1;i<=cnt;i++)
    {
       if(!rd[i])
       { 
           ans+=sum[i];
       }
    }
    printf("%d
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/mjc191812/p/12605800.html