poj3249
显然是一道最短路径的题目,但是
1 ≤ n ≤ 100000, 0 ≤ m ≤ 1000000能轻松打爆dij+heap
怎么办?
挖掘题意,这是一个DAG图(有向无环图)
所以对于此类问题,我们有特殊的作法
对于DAG,拓扑序列在前的点的最短路一定会被先更新(值得思考)
所以我们只用对DAG做一次拓扑,然后依次更新最短路即可;(其实很像dp)
多个入度为0的点不影响结果;
再回到这题,由于给出的是点的权值
可以考虑拆点,将点i拆成点i1,i2,i1,i2之间连一条指向i2的有向边,权值为原先点的权值
原先所有入边连向i1,出边连i2,权值都是0,这样就搞定了
拆点的做法在后面的网络流中会经常用到(当然这题也可以不拆)
type link=^node;
node=record
po,len:longint;
next:link;
end; var w:array[..] of link;
v:array[..] of boolean;
c,r,q,d:array[..] of longint;
n,m,ans,i,t,f,s,x,y:longint;
p,g:link;
function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end; procedure add(x,y,z:longint); //邻接表
var p:link;
begin
new(p);
p^.po:=y;
p^.len:=z;
p^.next:=w[x];
w[x]:=p;
end; begin
while not eoln do
begin
readln(n,m);
for i:= to *n do
w[i]:=nil;
fillchar(r,sizeof(r),);
fillchar(c,sizeof(c),);
for i:= to n do //拆点
begin
readln(x);
add(i+n,i,x);
inc(r[i]);
inc(c[i+n]);
end;
for i:= to m do //建边
begin
readln(x,y);
add(x,y+n,);
inc(r[y+n]);
inc(c[x]);
end;
s:=;
fillchar(v,sizeof(v),false);
fillchar(q,sizeof(q),);
for i:= to *n do //先找入度为0的点
if r[i]= then
begin
inc(s);
v[i]:=true;
q[s]:=i;
end;
f:=;
while s<*n do //生成拓扑序列
begin
inc(f);
p:=w[q[f]];
while p<>nil do
begin
dec(r[p^.po]);
if r[p^.po]= then
begin
inc(s);
q[s]:=p^.po;
end;
p:=p^.next;
end;
end;
for i:= to *n do //d[i]表示从某个入度为0的点到达当前点的最大距离
if v[i] then d[i]:= else d[i]:=-;
ans:=-;
for i:= to *n do
begin
f:=q[i];
p:=w[f];
g:=nil;
while p<>nil do //按照拓扑序列依次更新所有到达的点
begin
t:=p^.po;
d[p^.po]:=max(d[p^.po],d[f]+p^.len);
g:=p;
p:=p^.next;
dispose(g); //注意这题多测加上巨大的n,m很有可能把链表挤爆,所以及时释放掉空间
end;
end;
for i:= to *n do
if c[i]= then ans:=max(d[i],ans);
writeln(ans);
end;
end.
拓扑序列复杂度O(m),最短路O(m)
所以总的复杂度O(m)
poj3249的更多相关文章
- POJ3249:Test for Job
传送门 很简单的一道题,被卡了几次,死于答案非法统计. 题意是求图里的一条最长的路径满足起点的入度和终点的出度都是0,而且图是DAG. 既然是DAG求最长路,DP即可.搞出拓扑序,逆序DP,然后统计所 ...
- poj3249 Test for Job ——拓扑+DP
link:http://poj.org/problem?id=3249 在拓扑排序的过程中进行状态转移,dp[i]表示从起点到 i 这个点所得到的的最大值.比如从u点到v点,dp[v]=max(dp[ ...
- 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 ...
随机推荐
- php总结:1.php介绍
1.什么是php PHP,即“Hypertext Preprocessor”,是一种被广泛应用的开源通用脚本语言,尤其适用于 Web 开发并可嵌入 HTML 中去.它的语法利用了 C.Java 和 P ...
- JavaScript笔记(一)
JavaScript组成 EcmaScript:核心部分 作为解释器.几乎没有兼容性问题 DOM:Document Object Model,操作HTML页面的入口.有些操作不兼容. BOM:Brow ...
- php 微信开发之 微信支付 V3 开发 -CURLOP_TIMEOUT问题
如果不懂怎么配置的话请看文章 php 微信开发之 微信支付配置 基本配置后在继续本文章的开发 . 本文章就先继续基本的实现!也并不困难.我大概的思路的返回购买者的唯一id 和 订单号的唯一 id 就2 ...
- Spark Streaming揭秘 Day16 数据清理机制
Spark Streaming揭秘 Day16 数据清理机制 今天主要来讲下Spark的数据清理机制,我们都知道,Spark是运行在jvm上的,虽然jvm本身就有对象的自动回收工作,但是,如果自己不进 ...
- Oracle的Import用法
1. imp 命令介绍 imp 命令可以通过输入各种参数来控制导出方式: imp keyword=value 或 keyword=(value1,value2,...,valueN) ,例如 i ...
- 视网膜New iPad与普通分辨率iPad页面的兼容处理
一.这是篇经验分享 就算不是果粉也应该知道,iPad2与new iPad的重大区别之一就是显示屏的分辨率.new iPad显示屏被称之为“视网膜显示屏”,其设备分辨比(之前有详细介绍,点击这里查看)是 ...
- Android Studio 单刷《第一行代码》系列 03 —— Activity 基础
前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...
- 原生JS的对象常用操作总结
前端时间写了篇怎么判断js对象相等的文章,一直在期待大神给点消息,无奈一直杳无音讯,还是自己写个函数来进行判断,下面总结一些常用的对象操作的方法. 咋们来个先抑后扬的方式,先放出几个基本的 ...
- poj 3041 Asteroids (最大匹配最小顶点覆盖——匈牙利模板题)
http://poj.org/problem?id=3041 Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...
- C#中Thread.sleep()
我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题:1.假设现在是 2008-4-7 12:00:00.000,如果我调 ...