nyoj 20 吝嗇國度【dfs】
阿新 • • 發佈:2019-01-01
吝嗇的國度
時間限制:1000 ms | 記憶體限制:65535 KB
難度:3
描述
在一個吝嗇的國度裡有N個城市,這N個城市間只有N-1條路把這個N個城市連線起來。現在,Tom在第S號城市,他有張該國地圖,他想知道如果自己要去參觀第T號城市,必須經過的前一個城市是幾號城市(假設你不走重複的路)。
輸入
第一行輸入一個整數M表示測試資料共有M(1<=M<=5)組,每組測試資料的第一行輸入一個正整數N(1<=N<=100000)和一個正整數S(1<=S<=100000),N表示城市的總個數,S表示參觀者所在城市的編號,隨後的N-1行,每行有兩個正整數a,b(1<=a,b<=N),表示第a號城市和第b號城市之間有一條路連通。輸出每組測試資料輸N個正整數,其中,第i個數表示從S走到i號城市,必須要經過的上一個城市的編號。(其中i=S時,請輸出-1)
樣例輸入
1
10 1
1 9
1 8
8 10
10 3
8 6
1 2
10 4
9 5
3 7
樣例輸出
-1 1 10 10 9 8 3 1 1 8
剛開始做的時候,我單純的以為可以用並查集直接懟,然而我錯了【是我提交出錯】,直到我看到資料結構書時,才想到用樹來解決【剛學不就,用不熟,因為有指標,而我對指標有一種無法駕馭的感覺】,這道題可以用樹的孩子表示法,然後用深搜就可以解決。
已Accept程式碼【c++提交】【不會用vector】╮(╯﹏╰)╭
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; int n, s; typedef struct Son{ int data; struct Son *next; }Son, *Sson; struct Node{ int data; int data2;//儲存最後的序列 struct Son *next; }node[100001]; void init(int k) { for(int i = 0; i <= k; i++) { node[i].data = i; node[i].next = NULL; node[i].data2 = -1; } } void Get_Up(int a, int b) { Sson L = (Sson)malloc(sizeof(Son)); Sson K = (Sson)malloc(sizeof(Son)); L -> next = node[a].next; node[a].next = L; L -> data = b; K -> next = node[b].next; node[b].next = K; K -> data = a; } void DFS(int k) { Sson L = node[k].next; while(L) { if(node[L -> data].data2 == -1) { node[L -> data].data2 = k; DFS(L -> data); L = L -> next; } else L = L -> next; } } int main() { int t, a, b; scanf("%d", &t); while(t--) { scanf("%d%d", &n, &s); init(n); for(int i = 1; i < n; i++) { scanf("%d%d", &a, &b); Get_Up(a, b); } DFS(s); node[s].data2 = -1; printf("%d", node[1].data2); for(int i = 2; i <= n; i++) printf(" %d", node[i].data2); printf("\n"); } return 0; }