码迷,mamicode.com
首页 > 其他好文 > 详细

graph

时间:2015-11-04 17:25:47      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

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.

 

graph

标签:

原文地址:http://www.cnblogs.com/liuxinyu/p/4936278.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!