【題解】跳傘登山賽
阿新 • • 發佈:2019-03-30
輸入 遍歷 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; }
【題解】跳傘登山賽