1. 程式人生 > >nyoj 20 吝嗇國度【dfs】

nyoj 20 吝嗇國度【dfs】



吝嗇的國度
時間限制: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;
}