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 ...
随机推荐
- Unity3D MonoBehaviour的生命周期(lifecycle)
官方的事件函数的执行顺序中有详解(Link:Execution Order of Event Functions) (图片来源:http://whatiseeinit.blogspot.com/201 ...
- java多线程有哪些实际的应用场景?
多线程使用的主要目的在于: 1.吞吐量:你做WEB,容器帮你做了多线程,但是他只能帮你做请求层面的.简单的说,可能就是一个请求一个线程.或多个请求一个线程.如果是单线程,那同时只能处理一个用户的请求. ...
- 用oc写爬虫之HTMLParser
最近刚好有一些小需求,就尝试用OC来写一些简单的爬虫抓取网页上的数据: 发现了一个非常好用的HTMLParser工具 ; 语法是OC的,通过分析网页结构:可以很轻松的抓取需要的数据: 但是提前需要了解 ...
- 内存优化总结:ptmalloc、tcmalloc和jemalloc(转)
转载于:http://www.cnhalo.net/2016/06/13/memory-optimize/ 概述 需求 系统的物理内存是有限的,而对内存的需求是变化的, 程序的动态性越强,内存管理就越 ...
- nginx https 配置样例
站点nginx https 配置模板 第一章 nginx 支持https 配置样例 其他 相关链接地址 第一章 nginx 支持https 配置样例 说明:https 段配置参数说明 Server 段 ...
- node服务器中打开html文件的两种方法
方法1:利用 Express 托管静态文件,详情查看这里 方法2:使用fs模块提供的readFile方法打开文件,让其以text/html的形式输出. 代码: var express = requir ...
- Java注解应用,自定义注解映射实现方案说明.
插件结构如图: 注册模块定义了三个:用于实体与表映射的注解,用于属性到表字段的映射,用于映射时过滤掉的注解. 1.用于实体与表映射的注解 package com.dobby.plugins.annot ...
- Vue(八):监听属性watch
Vue.js 可以通过 watch 来响应数据的变化. 以下实例模拟购物车里商品数量增加,对应价格也增加 <!--模拟购物车商品数量增加,价格也随之增加--> <div id = & ...
- (Java编程思想)Thinking in Java
1. 为什么突然想去研读<Thinking in Java>? 最近终于下定决心撸了一本<Thinking in Java>第四版,虽然在此之前我就久闻这本书的大名,但一直未曾 ...
- TCP/IP协议理解
TCP/IP协议理解 一. 协议分层 由于ISO标准中的网络模型是个7层模型,但是由于7层模型对于当时的网络厂商来说太过复杂,很多厂家采用了简化的4层模型来实现网络设备,4层模型也就成了事实的网 ...