zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    多表查询,连表查询
    mysql数据概念难点
    mysql练习题
    linux下 redis
    nginx安装
    八皇后问题 OpenJ_Bailian
    Prime Ring Problem hdu-1016 DFS
    Oil Deposits hdu-1241 DFS
    Highways
    畅通工程再续
  • 原文地址:https://www.cnblogs.com/mjc191812/p/12605800.html
Copyright © 2011-2022 走看看