题目描述

给出 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。

思路

  图的遍历。DFS。

  用邻接矩阵不开动态数组60分。

var f:array[1..2000000,1..2000000] of boolean;
    ff:packed array[1..10000] of boolean;
    a:array[1..10000] of longint;
    n,m,i,sum,y,z:longint;

function max(a,b:longint):longint;
begin
    if a>b then exit(a) else exit(b);
end;

procedure dfs(x:longint);
var i:longint;
begin
    ff[x]:=true;
    sum:=max(sum,x);
    for i:=1 to n do
        if (f[x,i])and(not ff[i]) then
            dfs(i);
end;

procedure intt;
begin
    assign(input,'graph.in');
    assign(output,'graph.out');
    reset(input);
    rewrite(output);
end;

procedure outt;
begin
    close(input);
    close(output);
end;

begin
    //intt;
    writeln(sizeof(f) div 1024 div 1024);
    fillchar(f,sizeof(f),false);
    readln(n,m);
    for i:=1 to m do
        begin
            readln(y,z);
            f[y,z]:=true;
        end;
    for i:=1 to n do
        begin
            fillchar
            (ff,sizeof(ff),false);
            sum:=0;
            dfs(i);
            a[i]:=sum;
        end;
    for i:=1 to n do write(a[i],' ');
    //outt;
end.
View Code

相关文章:

  • 2021-04-05
  • 2022-12-23
  • 2021-11-19
  • 2022-01-15
  • 2021-07-29
  • 2021-05-05
  • 2021-12-05
  • 2021-10-11
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-15
  • 2021-08-05
相关资源
相似解决方案