codeforces 427C Checkposts

  1. 分析:tarjan模板题、
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    using namespace std;
    #define INF 0x7fffffff
    #define MOD 1000000007
    #define LL __int64
    const int maxn=100005;
    struct node{
        int e,next;
    }mpt[maxn*10];
    int head[maxn];
    int n,m,k;
    int low[maxn];
    int dfn[maxn];
    int vis[maxn];
    int que[maxn];
    int cnt,index,top;
    int num[maxn];
    LL ans,sum;
    void add(int s,int t){
        mpt[k].e=t;
        mpt[k].next=head[s];
        head[s]=k++;
    }
    int ff[maxn];
    void tarjan(int s){
        low[s]=dfn[s]=++index;
        que[++top]=s;
        vis[s]=1;
        for(int i=head[s];i!=-1;i=mpt[i].next){
            int e=mpt[i].e;
            if(!dfn[e]){
                tarjan(e);
                low[s]=min(low[s],low[e]);
            }
            else if(vis[e]){
                low[s]=min(low[s],dfn[e]);
            }
        }
        int minx=INF;
        int ss=0;
        memset(ff,-1,sizeof(ff));
        int w=1;
        if(low[s]==dfn[s]){
            cnt++;
            int e;
            do{
                e=que[top--];
                vis[e]=0;
                ff[w++]=e;
                minx=min(minx,num[e]);
            }while(s!=e);
            ans+=minx;
        }
    
        int hh=0;
        for(int i=1;i<w;i++)
        {
            if(num[ff[i]]==minx)hh++;
        }
        if(hh!=0)
        sum=(sum*hh)%MOD;
    
    }
    void init(){
        memset(head,-1,sizeof(head));
        memset(dfn,0,sizeof(dfn));
        memset(vis,0,sizeof(vis));
        cnt=k=index=0;
        top=-1;
    }
    int main(){
        int n,m;
        scanf("%d",&n);
            init();
            ans=0,sum=1;
            for(int i=1;i<=n;i++)
                scanf("%d",&num[i]);
            scanf("%d",&m);
            int a,b;
            for(int i=0;i<m;i++){
                scanf("%d%d",&a,&b);
                add(a,b);
            }
            for(int i=1;i<=n;i++){
                if(!dfn[i])
                    tarjan(i);
            }
            printf("%I64d %I64d\n",ans,sum);
        return 0;
    }

你可能感兴趣的:(Tarjan)