zoukankan      html  css  js  c++  java
  • hihocoder1185 连通性·三

    输入

    第1行:2个正整数,N,M。表示点的数量N,边的数量M。1≤N≤20,000, 1≤M≤100,000

    第2行:N个正整数,第i个整数表示第i个牧场的草量w[i]。1≤w[i]≤100,000

    第3..M+2行:2个正整数,u,v。表示存在一条从u到v的单向路径。1≤u,v≤N

    输出

    第1行:1个整数,最多能够吃到的牧草数量。

    样例输入
    6 6
    2 4 3 5 4 4
    1 2
    2 4
    1 3
    3 5
    3 6
    6 3
    样例输出
    13

    /* ***********************************************
    Author        :devil
    Created Time  :2016/6/9 15:45:46
    ************************************************ */
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <cmath>
    #include <stdlib.h>
    using namespace std;
    const int N=20010;
    int dfn[N],low[N],Stack[N],belong[N],cou,ed,cnt,n;
    int w[N],ans[N];
    bool instack[N];
    vector<int>eg[N],eg2[N];
    void dfs(int u)
    {
        dfn[u]=low[u]=cou++;
        Stack[ed++]=u;
        instack[u]=1;
        for(int i=0; i<eg[u].size(); i++)
        {
            int v=eg[u][i];
            if(!dfn[v])
            {
                dfs(v);
                low[u]=min(low[u],low[v]);
            }
            else if(instack[v]) low[u]=min(low[u],dfn[v]);
        }
        if(low[u]==dfn[u])
        {
            cnt++;
            int j;
            do
            {
                j=Stack[--ed];
                belong[j]=cnt;
                instack[j]=0;
            }
            while(j!=u);
        }
    }
    int dfs2(int u,int sum)
    {
        int mx=sum;
        for(int i=0; i<eg2[u].size(); i++)
            mx=max(mx,dfs2(eg2[u][i],sum+ans[eg2[u][i]]));
        return mx;
    }
    void print()
    {
        for(int i=1; i<=n; i++)
            for(int j=0; j<eg[i].size(); j++)
                if(belong[i]!=belong[eg[i][j]])
                    eg2[belong[i]].push_back(belong[eg[i][j]]);
        for(int i=1; i<=n; i++)
            ans[belong[i]]+=w[i];
        printf("%d
    ",dfs2(belong[1],ans[belong[1]]));
    }
    void init()
    {
        cou=1;ed=0;cnt=0;
        for(int i=1;i<=n;i++)
        {
            eg[i].clear();
            eg2[i].clear();
            dfn[i]=ans[i]=instack[i]=0;
        }
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        int m,u,v;
        while(~scanf("%d%d",&n,&m))
        {
            init();
            for(int i=1; i<=n; i++)
                scanf("%d",&w[i]);
            for(int i=0; i<m; i++)
            {
                scanf("%d%d",&u,&v);
                eg[u].push_back(v);
            }
            for(int i=1; i<=n; i++)
                if(!dfn[i])
                    dfs(i);
            print();
        }
        return 0;
    }
  • 相关阅读:
    Tomcat基于MSM+Memcached实现Session共享
    Zabbix简介及安装
    redis简介
    Ansible详解(二)
    Ansible详解(一)
    WAMP3.1.10/Apache 设置站点根目录
    最长回文子串--轻松理解Manacher算法
    一篇文章彻底了解Java垃圾收集(GC)机制
    java内存模型详解
    Java中23种设计模式--超快速入门及举例代码
  • 原文地址:https://www.cnblogs.com/d-e-v-i-l/p/5572398.html
Copyright © 2011-2022 走看看