POJ3249:Test for Job
很简单的一道题,被卡了几次,死于答案非法统计。
题意是求图里的一条最长的路径满足起点的入度和终点的出度都是0,而且图是DAG。
既然是DAG求最长路,DP即可。搞出拓扑序,逆序DP,然后统计所有入度为0的点的答案。
//POJ 3249
//by Cydiater
//2016.10.26
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <ctime>
#include <cmath>
#include <cstdlib>
#include <cstdio>
#include <iomanip>
#include <bitset>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
#define cmax(a,b) a=max(a,b);
const int MAXN=1e6+5;
const int oo=2000000001;
inline int read(){
char ch=getchar();int x=0,f=1;
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int Value[MAXN],LINK[MAXN],len=0,head,tail,indu[MAXN],N,M,outdu[MAXN],q[MAXN],f[MAXN],ans=-oo,Indu[MAXN];
struct edge{
int y,next;
}e[MAXN];
namespace solution{
inline void insert(int x,int y){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;}
void init(){
memset(Indu,0,sizeof(Indu));
memset(indu,0,sizeof(indu));
memset(outdu,0,sizeof(outdu));
memset(LINK,0,sizeof(LINK));
len=0;
up(i,1,N)Value[i]=read();
up(i,1,M){
int x=read(),y=read();
insert(x,y);
outdu[x]++;indu[y]++;Indu[y]++;
}
}
void slove(){
head=1;tail=0;
memset(f,-10,sizeof(f));
up(i,1,N)if(!indu[i])q[++tail]=i;
for(;head<=tail;head++){
int node=q[head];
for(int i=LINK[node];i;i=e[i].next)
if(--indu[e[i].y]==0)q[++tail]=e[i].y;
}
ans=-oo;
up(i,1,N)if(outdu[i]==0)f[i]=Value[i];
down(i,tail,1){
int node=q[i];
for(int j=LINK[node];j;j=e[j].next)cmax(f[node],f[e[j].y]+Value[node]);
if(Indu[node]==0)cmax(ans,f[node]);
}
}
void output(){
if(ans==-oo)ans=0;
printf("%d\n",ans);
}
}
int main(){
//freopen("input.in","r",stdin);
using namespace solution;
while(scanf("%d %d",&N,&M)!=EOF){
init();
slove();
output();
}
return 0;
}
POJ3249:Test for Job的更多相关文章
- poj3249 Test for Job ——拓扑+DP
link:http://poj.org/problem?id=3249 在拓扑排序的过程中进行状态转移,dp[i]表示从起点到 i 这个点所得到的的最大值.比如从u点到v点,dp[v]=max(dp[ ...
- poj3249
显然是一道最短路径的题目,但是 1 ≤ n ≤ 100000, 0 ≤ m ≤ 1000000能轻松打爆dij+heap 怎么办? 挖掘题意,这是一个DAG图(有向无环图) 所以对于此类问题,我们有特 ...
- poj3249 拓扑排序+DP
题意:给出一个有向无环图,每个顶点都有一个权值.求一条从入度为0的顶点到出度为0的顶点的一条路径,路径上所有顶点权值和最大. 思路:因为是无环图,则对于每个点经过的路径求其最大权值有,dp[i]=ma ...
- POJ3249(DAG上的dfs)
Test for Job Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10567 Accepted: 2482 Des ...
- poj3249【拓扑排序】
//题意: 给出一个有向无环图,每个顶点都有一个权值. // 求一条从入度为0的顶点到出度为0的顶点的一条路径, // 路径上所有顶点权值和最大. //我觉得只要明 ...
- POJ3249 Test for Job(拓扑排序+dp)
Test for Job Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10137 Accepted: 2348 Des ...
- poj3249 Test for job 【图的DAG dp】
#include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> ...
- poj3249 拓扑找最长路
Test for Job Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 11230 Accepted: 2651 Des ...
- Test for Job(poj3249)
Test for Job Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10209 Accepted: 2372 Des ...
随机推荐
- Automysqlbackup: WARNING: Turning off multicore support, since pigz isn’t there.
在使用Automysqlbackup备份MySQL时,有时候你会在邮件里面看见"WARNING: Turning off multicore support, since pigz isn' ...
- VIEW SERVER STATE permission was denied on object 'server', database 'master'
今天一同事反馈使用SQL Server 2012 Management Studio连接SQL Server 2014后,选择数据库中某个表,然后单击右键时,就会遇到下面错误: 这个错误初看以为是权限 ...
- C++ 栈和堆的区别
C++中的存储区分为全局数据区.代码区.堆.栈. 全局数据区存放静态数据.全局变量.常量. 代码区存放所有类成员函数和非成员函数的代码. 栈区存放用于函数的返回地址.形参.局部变量.返回类型. 堆区存 ...
- map.c 添加注释
注释仅代表个人理解,难免有错误之处,仅供参考! 1 /* 2 * linux/drivers/base/map.c 3 * 4 * (C) Copyright Al Viro ...
- android html.fromHtml 用例
private String content = "<b>标题</b><br>" + "内容<br>": mCo ...
- Merge k Sorted Lists
1. Merge Two Sorted Lists 我们先来看这个 问题: Merge two sorted linked lists and return it as a new list. The ...
- OpenCV 之 支持向量机 (一)
机器学习是由 模型 + 策略 + 算法 构成的,构建一种机器学习方法 (例如,支持向量机),就是具体去确定这三个要素. 1 支持向量机 支持向量机,简称 SVM (Support Vector Ma ...
- POJ3250[USACO2006Nov]Bad Hair Day[单调栈]
Bad Hair Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17774 Accepted: 6000 Des ...
- 杂项之pymysql连接池
杂项之pymysql连接池 本节内容 本文的诞生 连接池及单例模式 多线程提升 协程提升 后记 1.本文的诞生 由于前几天接触了pymysql,在测试数据过程中,使用普通的pymysql插入100W条 ...
- wireshark 分析重传包
如下图所示,经过实验,wireshark把第一次重传包分类为out of order 类型,可以通过tcp.analysis.out_of_order过滤,如果第二次重传,分类为fast retran ...