51 nod 1273 旅行計畫 樹DP

2021-08-08 06:28:10 字數 1316 閱讀 7040

1273 旅行計畫

codility

基準時間限制:1 秒 空間限制:131072 kb 分值: 80 

難度:5級演算法題

某個國家有n個城市,編號0 至 n-1,他們之間用n - 1條道路連線,道路是雙向行駛的,沿著道路你可以到達任何乙個城市。你有乙個旅行計畫,這個計畫是從編號k的城市出發,每天到達乙個你沒有去過的城市,並且旅途中經過的沒有去過的城市盡可能的多(如果有2條路線,經過的沒有去過的城市同樣多,優先考慮編號最小的城市),直到所有城市都觀光過一遍。現在給出城市之間的交通圖t,以及出發地點k,你來設計乙個旅行計畫,滿足上面的條件。例如:

第1天 從2到0 (城市 1 和 0 變成去過的)

第2天 從0到6 (城市 4 和 6 變成去過的)

第3天 從6到3 (城市 3 變成去過的)

第4天 從3到5 (城市 5 變成去過的)

上圖的輸入資料為:0 1 2 2 1 4。共7個節點,除節點0之外,共6行資料。

第1個數0表示1到0有1條道路。

第2個數1表示2到1有1條道路。

input

第1行:2個數n,k(1 <= n <= 50000, 0 <= k <= n - 1)

第2 - n + 1行:每行乙個數,表示節點之間的道路。

output

輸出旅行的路線圖,即每天到達的城市編號。
input示例

7 201

2214

output示例

206

35

解:很明顯目標城市一定是葉子節點,關鍵是怎麼實現;

一開始按照題目條件一步一步模擬,結果中間環節處理的很複雜;如果按照巨集觀的角度來考慮的話節點深度大的 節點編號小的一定先處理(不會被影響) 倒著遍歷一遍 他的節點數量就是沒被訪問過的節點數量

#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

const int n = 50000+10;

typedef long long ll;

vectorp[n];

int fax[n], vis[n];

struct node

for(int i=0;i

51nod1273 旅行計畫 貪心

某個國家有n個城市,編號0 至 n 1,他們之間用n 1條道路連線,道路是雙向行駛的,沿著道路你可以到達任何乙個城市。你有乙個旅行計畫,這個計畫是從編號k的城市出發,每天到達乙個你沒有去過的城市,並且旅途中經過的沒有去過的城市盡可能的多 如果有2條路線,經過的沒有去過的城市同樣多,優先考慮編號最小的...

51nod1442 士兵的旅行

裸網路流拆點就可以了。include include include includeusing namespace std define rep i,s,t for int i s i t i define dwn i,s,t for int i s i t i define clr x,c mem...

51nod 1442 士兵的旅行(最大流)

經典網路流模型。虛擬源點,匯點,拆點。拆點是因為每個士兵只能走一步。拆點後可以保證士兵只能走一步遠。然後判斷是否滿流和移動前人數總和是否等於移動後人數總和。include using namespace std const int maxn 1010 const int inf 0x7fffffff...