跳傘登山賽

題目描述

某山區(qū)有高高低低的 n 個(gè)山峰,根據(jù)海拔高度的不同,這些山峰由低到高進(jìn)行了 1 到 n 編號(hào)。 有 m 條只能單向通行的羊腸小道連接這些山峰?,F(xiàn)在,這里要舉行一場(chǎng)跳傘登山賽,選手們傘降到 某山峰后,再通過山間小道向?qū)儆谧约旱淖罡叻暹M(jìn)軍。 小明也參加了這次比賽,你能否告訴他,從任意一座山峰出發(fā)所能到達(dá)的最高峰編號(hào)是多少?

輸入格式

輸入共 m+1 行。
第 1 行為 2 個(gè)整數(shù) n、m,用一個(gè)空格隔開,表示山峰總數(shù)和道路總數(shù)。
接下來 m 行,每行 2 個(gè)整數(shù),用一個(gè)空格隔開,表示一條道路的起點(diǎn)和終點(diǎn)山峰編號(hào)。

輸出格式

輸出共 1 行,n 個(gè)整數(shù),用一個(gè)空格隔開,表示每座山峰所能到達(dá)的最高峰的編號(hào)。

輸入/輸出例子1

輸入:
4 3
1 2
2 4
4 3
輸出:
4 4 3 4
樣例解釋
【數(shù)據(jù)范圍】
60%的數(shù)據(jù)滿足:1≤m,n≤103;
100%的數(shù)據(jù)滿足: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;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容