Test for Job
Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 13457   Accepted: 3100

Description

Mr.Dog was fired by his company. In order to support his family, he must find a new job as soon as possible. Nowadays, It's hard to have a job, since there are swelling numbers of the unemployed. So some companies often use hard tests for their recruitment.

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 input file includes several test cases. 
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 iVi (0 ≤ |Vi|
≤ 20000) 
The next m lines each contain two integers xy 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

The output file contains one line for each test cases, in which contains an
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的更多相关文章

  1. POJ 3249 Test for Job (拓扑排序+DP)

    POJ 3249 Test for Job (拓扑排序+DP) <题目链接> 题目大意: 给定一个有向图(图不一定连通),每个点都有点权(可能为负),让你求出从源点走向汇点的路径上的最大点 ...

  2. poj 3249 Test for Job (记忆化深搜)

    http://poj.org/problem?id=3249 Test for Job Time Limit: 5000MS   Memory Limit: 65536K Total Submissi ...

  3. poj 3249(bfs+dp或者记忆化搜索)

    题目链接:http://poj.org/problem?id=3249 思路:dp[i]表示到点i的最大收益,初始化为-inf,然后从入度为0点开始bfs就可以了,一开始一直TLE,然后优化了好久才4 ...

  4. POJ 3249 Test for Job (dfs + dp)

    题目链接:http://poj.org/problem?id=3249 题意: 给你一个DAG图,问你入度为0的点到出度为0的点的最长路是多少 思路: 记忆化搜索,注意v[i]可以是负的,所以初始值要 ...

  5. poj 3249 Test for Job (DAG最长路 记忆化搜索解决)

    Test for Job Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 8990   Accepted: 2004 Desc ...

  6. Test for Job (poj 3249 记忆化搜索)

    Language: Default Test for Job Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9733   A ...

  7. POJ 3249 拓扑排序+DP

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

  8. poj 3249 拓扑排序 and 动态规划

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

  9. 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 ...

随机推荐

  1. 版本视图找不到数据 EDITIONING VIEW

    Oracle database 12 以后的版本,特别在EBS R12.2.X加入了版本视图这种技术,跟MOAC有点像. CREATE OR REPLACE FORCE EDITIONING VIEW ...

  2. Android的Databinding-自定义生成类名字

    1. 在xml中,添加class的属性并设置为自定义名字<data class="com.example.CustomBinding"></data>2. ...

  3. OpenCV支持向量机(SVM)介绍

    支持向量机(SVM)介绍 目标 本文档尝试解答如下问题: 如何使用OpenCV函数 CvSVM::train 训练一个SVM分类器, 以及用 CvSVM::predict 测试训练结果. 什么是支持向 ...

  4. maven本地仓库中存在jar包,但编译不成功,显示jar包不存在

    介绍一下背景,项目要迁移进坑人的离线的内网开发,将在同事那编译通过的代码和maven仓库拷进内网,打算编译通过之后再上传私服,结果配好maven之后,本地库中的部分jar包显示没有引入,如下面的波浪线 ...

  5. [Aaronyang] 写给自己的WPF4.5 笔记10[层次数据需求处理,TreeView绿色文章1/4]

     我的文章一定要做到对读者负责,否则就是失败的文章  ---------   www.ayjs.net    aaronyang技术分享 AY留言: 文章根据难易,我根据游戏的规则进行了分色,希望读者 ...

  6. Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name

    启动apache的时候,报告以下消息提示: Starting httpd: httpd: Could not reliably determine the server's fully qualifi ...

  7. ubuntu安装odbc及(mysql驱动)

    一.安装odbc apt-get install unixodbc 如果需要用到编译的头文件之类的 apt-get install unixodbc-dev 二.安装mysql驱动 apt-get i ...

  8. [转]linux(ubuntu)上运行网易popo

    popo没有linux版,连web版和android版都没有,这个实在是不方便.搞了很久,终于搞定了ubuntu上运行popo,暂时还没出现什么问题. 首先要安装PlayOnLinux,直接安装win ...

  9. H5的Video事件,控制方法,及监听

    1.标签基本属性 src :视频的属性 poster:视频封面,没有播放时显示的图片preload:预加载autoplay:自动播放loop:循环播放controls:浏览器自带的控制条width:视 ...

  10. 我要搬家到csdn,大家到那里来看我吧,平台更大,看到的人更多!

    ruby代码 #encoding: utf-8 require 'net/http' require 'open-uri' require 'nokogiri' # 用于解析html的模块 # sud ...