POJ 3249 Test for Job
| Time Limit: 5000MS | Memory Limit: 65536K | |
| Total Submissions: 13457 | Accepted: 3100 |
Description
The test is like this: starting from a source-city, you may pass through some directed roads to reach another city. Each time you reach a city, you can earn some profit or pay some fee, Let this process continue until you reach a target-city. The boss will compute the expense you spent for your trip and the profit you have just obtained. Finally, he will decide whether you can be hired.
In order to get the job, Mr.Dog managed to obtain the knowledge of the net profit Vi of all cities he may reach (a negative Vi indicates that money is spent rather than gained) and the connection between cities. A city with no roads leading to it is a source-city and a city with no roads leading to other cities is a target-city. The mission of Mr.Dog is to start from a source-city and choose a route leading to a target-city through which he can get the maximum profit.
Input
The first line of each test case contains 2 integers n and m(1
≤ n ≤ 100000, 0 ≤ m ≤ 1000000) indicating the number of cities
and roads.
The next n lines each contain a single integer. The ith line
describes the net profit of the city i, Vi (0 ≤ |Vi|
≤ 20000)
The next m lines each contain two integers x, y indicating
that there is a road leads from city x to city y. It is
guaranteed that each road appears exactly once, and there is no way to
return to a previous city.
Output
integer indicating the maximum profit Dog is able to obtain (or the minimum
expenditure to spend)
Sample Input
6 5
1
2
2
3
3
4
1 2
1 3
2 4
3 4
5 6
Sample Output
7
Hint

Source
【题意】
给n个点,m条单向边,每个点有点权,没有边权,然后遍历
一条路径:以任意一个入度为0的点为起点,沿着单向边走,走到任意一个出度为0的点为终点,路径长度为经过个点的点权之和。
求最长路径。
【分析】
一开始想的是拓扑排序,分离出起点和终点,然后dijkstra跑一遍。结果,无论算时间复杂度,还是实际交付评测,都会T。
然后,再读题目,发现每个点的后继都唯一,然后,满足无后效性,猜想DP,递推代码不好打,直接从每个起点记忆话搜索,跑最长路。
保证时间复杂度:O(m)
【代码】
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#define m(s) memset(s,0,sizeof s)
using namespace std;
const int N=1e5+5;
int n,m,val[N],du[N],f[N];
vector<int>e[N];
inline void Clear(){
m(du);m(f);
for(int i=1;i<=n;i++) e[i].clear();
}
inline void Init(){
for(int i=1;i<=n;i++) scanf("%d",val+i);
for(int i=1,x,y;i<=m;i++) scanf("%d%d",&x,&y),du[y]++,e[x].push_back(y);
}
int dfs(int x){
int &now=f[x];
if(now) return now;
now=-2e9;
if(!e[x].size()) return now=val[x];
for(int i=0;i<e[x].size();i++){
int v=e[x][i];
now=max(now,val[x]+dfs(v));
}
return now;
}
inline void Solve(){
int ans=-2e9;
for(int i=1;i<=n;i++){
if(!du[i]){
ans=max(ans,dfs(i));
}
}
printf("%d\n",ans);
}
int main(){
while(scanf("%d%d",&n,&m)==2){
Clear();
Init();
Solve();
}
return 0;
}
POJ 3249 Test for Job的更多相关文章
- POJ 3249 Test for Job (拓扑排序+DP)
POJ 3249 Test for Job (拓扑排序+DP) <题目链接> 题目大意: 给定一个有向图(图不一定连通),每个点都有点权(可能为负),让你求出从源点走向汇点的路径上的最大点 ...
- poj 3249 Test for Job (记忆化深搜)
http://poj.org/problem?id=3249 Test for Job Time Limit: 5000MS Memory Limit: 65536K Total Submissi ...
- poj 3249(bfs+dp或者记忆化搜索)
题目链接:http://poj.org/problem?id=3249 思路:dp[i]表示到点i的最大收益,初始化为-inf,然后从入度为0点开始bfs就可以了,一开始一直TLE,然后优化了好久才4 ...
- POJ 3249 Test for Job (dfs + dp)
题目链接:http://poj.org/problem?id=3249 题意: 给你一个DAG图,问你入度为0的点到出度为0的点的最长路是多少 思路: 记忆化搜索,注意v[i]可以是负的,所以初始值要 ...
- poj 3249 Test for Job (DAG最长路 记忆化搜索解决)
Test for Job Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 8990 Accepted: 2004 Desc ...
- Test for Job (poj 3249 记忆化搜索)
Language: Default Test for Job Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 9733 A ...
- POJ 3249 拓扑排序+DP
貌似是道水题.TLE了几次.把所有的输入输出改成scanf 和 printf ,有吧队列改成了数组模拟.然后就AC 了.2333333.... Description: MR.DOG 在找工作的过程中 ...
- poj 3249 拓扑排序 and 动态规划
思路:我们首先来一遍拓扑排序,将点按先后顺序排列于一维数组中,然后扫描一遍数组,将每个点的出边所连接的点进行更新,即可得到最优解. #include<iostream> #include& ...
- POJ - 3249 Test for Job (DAG+topsort)
Description Mr.Dog was fired by his company. In order to support his family, he must find a new job ...
随机推荐
- JSON序列——根据JSON生成事务性SQL2
JSON序列——根据JSON生成事务性SQL2 procedure TForm1.Button3Click(Sender: TObject); begin var json:string:=''+ ' ...
- dhtmlxtree 节点 展开收缩:新增了直接点 文本内容 也 实现了 展开收缩 功能(并记住了展开、收缩状态)
dhtmlxtree 节点 展开收缩通常情况我们按 +- 就实现了 展开收缩 功能,为了方便我们新增了直接点 文本内容 也 实现了 展开收缩 功能(并记住了展开.收缩状态) tree = new dh ...
- 推荐10本C#编程的最佳书籍
C#和.NET非常受全球开发人员的追捧和热爱.书籍是人类进步的阶梯.想要学习C# ?这里有10本学习C#编程的最好书籍在等着你哦. 1.<C# 5.0 in a Nutshell>:权威的 ...
- 你还记得当初为什么进入IT行业吗?
说到这个问题,小编相信不少童鞋开始忆往昔峥嵘岁月,那个少年为了心中的改变世界的理想,进入了这个行业,但是呢,有一群人画风就不一样了,他们进入IT行业,完全只是是因为.... 小时候广告看多了....: ...
- Oracle 12c 添加scott用户
对于熟悉Oracle或者接触过Oracle的人,scott这个用户大家一定相当的熟悉.12c推出了可插拔数据库,在一个容器cdb中以多租户的形式同时存在多个数据库pdb.pdb中默认不包含scott用 ...
- 怎么去掉Xcodeproject中的某种类型的警告 Implicit conversion loses integer precision: 'NSInteger' (aka 'long') to 'int32
问题描写叙述 在我们的项目中,通常使用了大量的第三方代码,这些代码可能非常复杂,我们不敢修改他们,但是作者已经停止更新了,当sdk升级或者是编译器升级后,这些遗留的代码可能会出现许很多多的警告,那么 ...
- struts2:表单标签
目录 表单标签1. form标签2. submit标签3. checkbox标签4. checkboxlist标签5. combobox标签6. doubleselect标签7. head标签8. f ...
- ES6,扩展运算符的用途
ES6的扩展运算符可以说是非常使用的,在给多参数函数传参,替代Apply,合并数组,和解构配合进行赋值方面提供了很好的便利性. 扩展运算符就是三个点“...”,就是将实现了Iterator 接口的对象 ...
- Python3自定义http/https请求拦截mitmproxy脚本
[本文出自天外归云的博客园] 脚本内容 代码如下: from mitmproxy import http, ctx from multiprocessing import Lock class Fil ...
- python 中的i++ ,逻辑表达式
1.关于i++ python 中的没有 i++ ,如果写了会报语法错误. 但是python 中有 --i,++i,+-i,-+i,他们不是实现-1操作的,仅仅是作为判断运算符号,类似数学中的负负得正 ...