美文网首页
跳伞登山赛

跳伞登山赛

作者: 何景根 | 来源:发表于2020-11-18 15:49 被阅读0次

    题目描述

    某山区有高高低低的 n 个山峰,根据海拔高度的不同,这些山峰由低到高进行了 1 到 n 编号。 有 m 条只能单向通行的羊肠小道连接这些山峰。现在,这里要举行一场跳伞登山赛,选手们伞降到 某山峰后,再通过山间小道向属于自己的最高峰进军。 小明也参加了这次比赛,你能否告诉他,从任意一座山峰出发所能到达的最高峰编号是多少?

    输入格式

    输入共 m+1 行。
    第 1 行为 2 个整数 n、m,用一个空格隔开,表示山峰总数和道路总数。
    接下来 m 行,每行 2 个整数,用一个空格隔开,表示一条道路的起点和终点山峰编号。

    输出格式

    输出共 1 行,n 个整数,用一个空格隔开,表示每座山峰所能到达的最高峰的编号。

    输入/输出例子1

    输入:
    4 3
    1 2
    2 4
    4 3
    输出:
    4 4 3 4
    样例解释
    【数据范围】
    60%的数据满足:1≤m,n≤103;
    100%的数据满足:1≤m,n≤105。

    代码

    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include <cstring>
    using namespace std;
    static std::vector<int> edge[100005];
    static bool visit[100005];
    static int f[100005], n, m, s, e;
    static void dfs(int& val, int sta)
    {
        visit[sta] = true;
        for (int i = 0; i < edge[sta].size(); i++)
            if (!visit[edge[sta][i]])
            {
                if (f[edge[sta][i]] > val)
                {
                    val = f[edge[sta][i]];
                }
                dfs(val, edge[sta][i]);
            }
    }
    int main()
    {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= m; i++)
        {
            scanf("%d%d", &s, &e);
            edge[s].push_back(e);
        }
        for (int i = 1; i <= n; i++)
            f[i] = i;
        for (int i =1 ; i <=n ; i++)
        {
            dfs(f[i], i);
            memset(visit,0,sizeof(visit));
        }
        for (int i = 1; i <= n; i++) printf("%d ", f[i]);
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:跳伞登山赛

          本文链接:https://www.haomeiwen.com/subject/lslxiktx.html