1. 程式人生 > >【題解】跳傘登山賽

【題解】跳傘登山賽

輸入 遍歷 bsp 題解 ins 出發 str clas nbsp

題目描述

某山區有高高低低的n個山峰,根據海拔高度的不同, 這些山峰由低到高進行了1到n編號。

有m條只能單向通行的羊腸小道連接這些山峰。現在,這裏要舉行一場跳傘登山賽,選手們傘降到某山峰後,再通過山間小道向屬於自己的最高峰進軍。

小明也參加了這次比賽,你能否告訴他,從任意一座山峰出發所能到達的最高峰編號是多少?

輸入輸出格式

輸入格式

輸入共m+1行。

第1行為2個整數n、m,用一個空格隔開,表示山峰總數和道路總數。

接下來m行,每行2個整數,用一個空格隔開,表示一條道路的起點和終點山峰編號。

輸出格式

輸出共1行,n個整數,用一個空格隔開,表示每座山峰所能到達的最高峰的編號。

輸入輸出樣例

輸入樣例

4 3

1 2

2 4

4 3

輸出樣例

4 4 3 4

說明

數據規模

60%的數據滿足:1≤m,n≤1000。

100%的數據滿足:1≤m,n≤10000。

題解

從最高峰開始枚舉,更新所有未被遍歷過的山峰。

技術分享圖片
#include <iostream>
#include <set>
#define
MAX_N 100001 using namespace std; int n; set<int> s[MAX_N]; int ans[MAX_N]; void DFS(int, int); int main() { int m; cin >> n >> m; while(m--) { int prev, next; cin >> next >> prev; s[prev].insert(next); }
for(register int i = n; i >= 1; i--) { if(!ans[i]) DFS(i, i); } for(register int i = 1; i <= n; i++) { cout << ans[i]; if(i < n) cout << ; } return 0; } void DFS(int idx, int val) { ans[idx] = val; while(!s[idx].empty()) { int next; next = *s[idx].begin(); s[idx].erase(s[idx].begin()); if(!ans[next]) DFS(next, val); } return; }
參考程序

【題解】跳傘登山賽