洛谷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.