您的位置:首页 > 其它

洛谷P1137 旅行计划

2017-06-29 09:06 295 查看

题目描述

国家有N个城市,编号为1~N,并且有M条道路连接着,从其中一个城市出发,并只往东走到城市i停止。制定一条路线以城市i为终点,使得线路上除了第一个城市,每个城市都在路线前一个城市东面,并且满足这个前提下还希望游览的城市尽量多。求出以所有城市为终点最多能够游览多少个城市。


输入格式:

输入的第1行为两个正整数N, M。接下来M行,每行两个正整数x, y,表示了有一条连接城市x与城市y的道路,保证了城市x在城市y西面。


输出格式:

输出包括N行,第i行包含一个正整数,表示以第i个城市为终点最多能游览多少个城市。


输入样例#1:

5 6
1 2
1 3
2 3
2 4
3 4
2 5


输出样例#1:

1
2
3
4
3


思路

拓扑排序,从西往东走,每一个入度为0的城市x,与它相连的城市y,d[y]:=max(d[y],d[x]+1){d[i]表示以i为终点的最多游览城市数量},并减去城市y的入度,如果城市y入度为0,则把y放入队列。


type
rec=record
x,y,next:longint;
end;
var
n,m:longint;
g:array[1..200000] of rec;
ls:array[1..200000] of longint;
d,h,l:array[1..200000] of longint;
procedure main;
var
i:longint;
begin
read(n,m);
for i:=1 to m do
with g[i] do
begin
read(x,y);
inc(d[y]);
next:=ls[x];
ls[x]:=i;
end;
end;

var
i,t,a,b:longint;
begin
main;
a:=0;
for i:=1 to n do if d[i]=0 then begin inc(b);l[b]:=i;end;
while a<b do
begin
inc(a);
t:=ls[l[a]];
while t>0 do
begin
with g[t] do
begin
dec(d[y]);
if d[y]=0 then begin inc(b);l[b]:=y;end;
if h[x]+1>h[y] then h[y]:=h[x]+1;
end;
t:=g[t].next;
end;
end;
for i:=1 to n do
writeln(h[i]+1);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: