思路:我们首先来一遍拓扑排序,将点按先后顺序排列于一维数组中,然后扫描一遍数组,将每个点的出边所连接的点进行更新,即可得到最优解。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define inf 2000000010
#define Maxn 100010
#define Maxm 1000010
using namespace std;
int dist[Maxn],vi[Maxn],index[Maxn],e,value[Maxn],indegree[Maxn],outdegree[Maxn],ans[Maxn],num,n;
struct Edge{
int to,next,val;
}edge[Maxm];
void addedge(int from ,int to ,int val )
{
edge[e].to=to;
edge[e].val=val;
edge[e].next=index[from];
index[from]=e++;
}
int Max=-inf;
void Topsort()
{
queue<int> q;
int i,j,k,now,adj;
for(i=;i<=n;i++)
{
if(indegree[i]==)
{
q.push(i);
dist[i]=value[i];
}
}
while(!q.empty())
{
now=q.front();
ans[num++]=now;
q.pop();
for(i=index[now];i!=-;i=edge[i].next)
{
adj=edge[i].to;
indegree[adj]--;
if(!indegree[adj])
q.push(adj);
}
}
for(i=;i<num;i++)
{
//cout<<ans[i]<<" ";
for(j=index[ans[i]];j!=-;j=edge[j].next)
{
dist[edge[j].to]=max(dist[edge[j].to],dist[ans[i]]+edge[j].val);
}
if(outdegree[ans[i]]==)
{
if(dist[ans[i]]>Max)
Max=dist[ans[i]];
}
}
//cout<<endl;
}
void init()
{
memset(indegree,,sizeof(indegree));
memset(outdegree,,sizeof(outdegree));
memset(index,-,sizeof(index));
memset(vi,,sizeof(vi));
memset(ans,,sizeof(ans));
for(int i=;i<=;i++)
dist[i]=-inf;
Max=-inf;
e=;
num=;
}
int main()
{
int m,i,j,a,b,val;
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
for(i=;i<=n;i++)
scanf("%d",&value[i]);
for(i=;i<=m;i++)
{
scanf("%d%d",&a,&b);
addedge(a,b,value[b]);
indegree[b]++,outdegree[a]++;
}
Topsort();
//for(i=1;i<=n;i++)
//cout<<dist[i]<<endl;
printf("%d\n",Max);
}
return ;
}

poj 3249 拓扑排序 and 动态规划的更多相关文章

  1. POJ 3249 拓扑排序+DP

    貌似是道水题.TLE了几次.把所有的输入输出改成scanf 和 printf ,有吧队列改成了数组模拟.然后就AC 了.2333333.... Description: MR.DOG 在找工作的过程中 ...

  2. 【BZOJ3832】[POI2014]Rally(拓扑排序,动态规划)

    [BZOJ3832][POI2014]Rally(拓扑排序,动态规划) 题面 BZOJ,权限题 洛谷 题解 这题好强啊,感觉学了好多东西似的. 首先发现了一个图画的很好的博客,戳这里 然后我来补充一下 ...

  3. poj 3687(拓扑排序)

    http://poj.org/problem?id=3687 题意:有一些球他们都有各自的重量,而且每个球的重量都不相同,现在,要给这些球贴标签.如果这些球没有限定条件说是哪个比哪个轻的话,那么默认的 ...

  4. poj 2585 拓扑排序

    这题主要在于建图.对9个2*2的小块,第i块如果出现了不等于i的数字,那么一定是在i之后被brought的.可以从i到该数字建一条边. 图建好后,进行一次拓扑排序,判段是否存在环.若存在环,那么就是B ...

  5. Sorting It All Out POJ - 1094 拓扑排序

    题意:给N个字母,和M个偏序关系 求一个可确定的全序,可确定是指没有其他的可能例如A>B D>B 那么有ADB DAB两种,这就是不可确定的其中,M个偏序关系可以看做是一个一个按时间给出的 ...

  6. 洛谷P3953 逛公园(NOIP2017)(最短/长路,拓扑排序,动态规划)

    洛谷题目传送门 又是一年联赛季.NOIP2017至此收官了. 这个其实是比较套路的图论DP了,但是细节有点恶心. 先求出\(1\)到所有点的最短路\(d1\),和所有点到\(n\)的最短路\(dn\) ...

  7. nyoj 349 (poj 1094) (拓扑排序)

    Sorting It All Out 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 An ascending sorted sequence of distinct ...

  8. Poj(3687),拓扑排序,

    题目链接:http://poj.org/problem?id=3687 题意:n个重量为1~n的球,给定一些编号间的重量比较关系,现在给每个球编号,在符合条件的前提下使得编号小的球重量小.(先保证1号 ...

  9. POJ 1094 拓扑排序

    Description:      规定对于一个只有大写字母的字符串是有大小顺序的.如ABCD.即A<B.B<C.C<D.那么问题来了.现在第一行给你n, m代表序列里只会出现前n的 ...

随机推荐

  1. PC问题-该虚拟机似乎正在使用中

    问题现象:运行VMware Workstation,选中一个虚拟机,运行.卡住了,再运行VMware Workstation时,选中一个虚拟机,提示“该虚拟机似乎正在使用中”. 问题原因:因为上次非正 ...

  2. stdlib.h 头文件

    stdlib 头文件即standard library标准库头文件.stdlib.h里面定义了五种类型.一些宏和通用工具函数. 类型例如size_t.wchar_t.div_t.ldiv_t和lldi ...

  3. hibernate注解@JoinTable说明

    表关联(@JoinTable)注解说明:@Target({METHOD, FIELD})public @interface JoinTable{    String name() default &q ...

  4. ASCII,GB2312,GBK,Unicode,Utf-8

    1.ASCII:American Stardand Code for Information Interchange,是当时美国制定出来的一套编码系统,使用7位或8位二进制来表示西文字符,0-31以及 ...

  5. twisted 安装时,安装顺序为 zope.interface ->twisted

    最近想学 twisted ,就去下载 twisted 的windows版本,并且 安装.运行 twisted 例子后,发现出现了问题: ImportError: Twisted requires zo ...

  6. Cocos2d-x——Cocos2d-x 屏幕适配新解 – 兼容与扩展【转载】

    Cocos2d-x 屏幕适配新解 – 兼容与扩展 本文出自[无间落叶](转载请保留出处):http://blog.leafsoar.com/archives/2013/05-13-08.html 在读 ...

  7. VM中ubuntu已经正确配置了静态IP仍无法上网

    情况描述:正确配置了ubuntu的IP,getway,DNS..无法ping通getway. 环境:宿主机:win7 32Bit  虚拟机:ununtu 10.04  VM:9.0.1 build-8 ...

  8. Android——设计原则(Design Principles)

    Enchant Me Delight me in surprising ways(动画.音效...) Real objects are more fun than buttons and menus( ...

  9. delphi 获取网页源代码

    //获取网页源代码 var   s: string; begin   s := WebBrowser1.OleObject.document.body.innerHTML; //body内的所有代码 ...

  10. JAVA数组的定义及用法

    数组是有序数据的集合,数组中的每一个元素具有同样的数组名和下标来唯一地确定数组中的元素. 1. 一维数组 1.1 一维数组的定义 type arrayName[]; type[] arrayName; ...