zoukankan      html  css  js  c++  java
  • poj3249【拓扑排序】


    //题意:   给出一个有向无环图,每个顶点都有一个权值。
    //         求一条从入度为0的顶点到出度为0的顶点的一条路径,
    //         路径上所有顶点权值和最大。

    //我觉得只要明白
    //图论里的链式前向星   的  建图原理  和  拓扑排序的一点知识就完全有能力打出来

    //以后还是可以练练手的  所以写一发吧吐舌头



    //拓扑排序+优化一下
    //author keyboarder
    //time   2016/4/23 21:52
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <algorithm>
    #include <queue>
    #include <math.h>
    #include <queue>
    #include <stack>
    using namespace std;
    #define INF 0x3f3f3f
    #define pi acos(-1.0)
    #define LL long long
    #define mm 1000000007

    #define N 1000010

    struct asd{
        int to;
        int next;
    };
    asd q[N];
    int head[N],tol;
    int pre[N];
    int out[N];
    int val[N];
    int dp[N];
    int n,m;

    void add(int a,int b)
    {
        q[tol].to=b;
        q[tol].next=head[a];
        head[a]=tol++;
    }

    void tuopu()
    {
        queue<int>e;
        while(!e.empty())
            e.pop();
        for(int i=1;i<=n;i++)
        {
            if(pre[i]==0)
            {
                pre[i]=-1;
                e.push(i);
            }
        }
        while(!e.empty())
        {
            int u=e.front();
            e.pop();
            for(int v=head[u];v!=-1;v=q[v].next)
            {
                int i=q[v].to;
                dp[i]=max(dp[u]+val[i],dp[i]);
                pre[i]--;
                if(pre[i]==0)
                {
                    pre[i]=-1;
                    e.push(i);
                }
            }
        }
    }

    int main()
    {
        while(~scanf("%d%d",&n,&m))
        {
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&val[i]);
            }
            int u,v;
            tol=0;
            memset(head,-1,sizeof(head));
            memset(pre,0,sizeof(pre));
            memset(out,0,sizeof(out));
            for(int i=0;i<m;i++)
            {
                scanf("%d%d",&u,&v);
                add(u,v);
                pre[v]++;
                out[u]++;
            }
            for(int i=1;i<=n;i++)
            {
                if(pre[i]==0)
                {
                    dp[i]=val[i];
                }
                else
                    dp[i]=-INF;
            }

            tuopu();

            int ans=-INF;
            for(int i=1;i<=n;i++)
            {
                if(out[i]==0)
                    ans=max(ans,dp[i]);
            }
            printf("%d ",ans);
        }
        return 0;
    }


  • 相关阅读:
    安装pipenv
    ModuleNotFoundError: No module named 'pip._internal' , pip 无法下载软件 解决办法
    1.3用户列表 and 新闻列表
    1.2用户统计页面实现
    1.5发布新闻
    七牛云平台(存储图片)
    1.2头像设置功能
    1.4用户收藏展示
    1.3密码修改
    1.2首页刷新以及点击排行
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934564.html
Copyright © 2011-2022 走看看