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. Log4j2 + Maven的配置文件示例详解

    一.配置Maven:pom.xml <properties> <project.build.sourceEncoding>UTF-8</project.build.sou ...

  2. go自动补全

    安装: get -u github.com/posener/complete/gocomplete gocomplete -install 卸载: gocomplete -uninstall http ...

  3. SpringBoot(八):系统错误统一拦截器

    在日常 web 开发中发生了异常,往往需要通过一个统一的 异常处理,来保证客户端能够收到友好的提示.本文将会介绍 Spring Boot 中的 全局统一异常处理. Springboot的全局异常查是通 ...

  4. Spring导出可以运行的jar包

    最近需要解决Maven项目导入可执行的jar包的问题,如果项目不包含Spring,那么使用mvn assembly:assembly即可,详情可以参考:http://www.cnblogs.com/l ...

  5. oracle 11g 安装及netca,dbca乱码之解决

    在中文Linux下安装Oracle 11g,运行runInstaller后默认会出现乱码,解决办法如下: 1.准备字体zysong.ttf,点击下载,解压下载到的fallback 2.使用归档管理器打 ...

  6. zabbix用户管理

    zabbix用户管理,主要包括用户增删改查.用户报警媒介管理.用户权限管理. 安装完zabbix后,已经自带了两个用户Admin和Guests 超级管理员默认账号:Admin,密码:zabbix,这是 ...

  7. [BetterExplained]为什么你应该(从现在开始就)写博客

    (一)为什么你应该(从现在开始就)写博客 用一句话来说就是,写一个博客有很多好处,却没有任何明显的坏处.(阿灵顿的情况属于例外,而非常态,就像不能拿抽烟活到一百岁的英国老太太的个例来反驳抽烟对健康的极 ...

  8. linux下查看端口占用

    1. lsof -i:端口号 用于查看某一端口的占用情况 需要注意的是,centos默认是没有安装lsof(list open files)的,需要手动安装 yum install lsof 各列代表 ...

  9. Adobe Photoshop CC2019中文破解版

    今天突发兴致玩PS, 之前安装的是CS6, 下载安装色相环插件后 先采用拷贝文件夹的方式将Coolorus放到plug-in下, 重启发现窗口>扩展程序 这项是灰色的. 于是采用安装coolor ...

  10. MATLAB 统计数据并画出统计直方图

    统计FilmTrust(0.5-4.0分).CiaoDVD(1-5分).MovieLens(1-5分) 等 rating 数据集分值的分布:  以 统计FilmTrust(0.5-4.0分) 为例: ...