标签:
Problem 1 Graph (graph.cpp/c/pas)
【题目描述】
给出 N 个点,M 条边的有向图,对于每个点 v,求 A(v) 表示从点 v 出发,能到达的编号最大的点。
【输入格式】
第 1 行,2 个整数 N,M。 接下来 M 行,每行 2 个整数 Ui,Vi,表示边 ?Ui,Vi?。点用 1,2,...,N 编号。
【输出格式】
N 个整数 A(1),A(2),...,A(N)。
【样例输入】
4 3
1 2
2 4
4 3
【样例输出】
4 4 3 4
【数据范围】
对于 60% 的数据,1 ≤ N,K ≤ 10^3
对于 100% 的数据,1 ≤ N,M ≤ 10^5。
思路:为了防止超内存,应用边表存储。然后再从最大的一个点开始,将每一个与它相连的点的答案都赋成这个点,在搜索下一个点,直到所有的点都被赋值。
program df; var head,f:array[1..100000]of longint;//head[i]i的最后一条边;f[i]第i点的最大目的地,即最终答案; next,v:array[1..100000]of longint;//next为边i的下一条边;v[i]表示边i的出度 b:array[1..100000]of boolean;//判断i点是否被赋值 n,i,m,j,a1,a2,max:longint; procedure dfs(a1:longint); var b1:longint; begin if b[a1] then exit; b[a1]:=true; f[a1]:=max; b1:=head[a1]; while b1<>0 do begin dfs(v[b1]); b1:=next[b1]; end; end; begin read(n,m); for i:=1 to m do begin read(a1,a2); next[i]:=head[a2]; head[a2]:=i; v[i]:=a1; end; for i:=n downto 1 do if not b[i] then begin max:=i; dfs(i); end; for i:=1 to n-1 do write(f[i],‘ ‘); writeln(f[n]); end.
标签:
原文地址:http://www.cnblogs.com/liuxinyu/p/4936278.html