吝嗇的國度

吝嗇的國度

 時間限制: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

知識點:

動態數組(vector):
    頭文件:#include<vector>
    作用:開闢一個動態的數組利用push_back()與頭相連(也就是封裝到一塊兒);
    例:pre[v[cur][i]] 中pre[]爲一個數組,v[cur][i]v[cur]爲頭,“i”表示除頭之外從‘0’開始的第‘i’個成員;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;

int pre[100005];
vector<int>v[100005];

void DFS(int cur)
{
    for(int i = 0; i < v[cur].size(); i++)
    {
        if(pre[v[cur][i]])
            continue; ///若存在父節點則繼續遍歷
        pre[v[cur][i]] = cur;///相連節點的父節點爲cur
        DFS(v[cur][i]); ///深搜到底,把一條路上父節點全部找出
    }
}
int main()
{
    int n, num, cur, i, x, y;
    scanf("%d", &n);
    while(n--)
    {
        memset(v, 0, sizeof(v));///初始化數組;
        memset(pre, 0, sizeof(pre));
        scanf("%d%d", &num, &cur);
        pre[cur] = - 1; ///起點沒有父節點
        for(i = 0; i < num - 1; i++)
        {
            scanf("%d %d", &x, &y);
            v[x].push_back(y); ///x與y相連
            v[y].push_back(x); ///y與x也肯定相連
        }                       ///x.push_back(y) -->把y放進x中;
        DFS(cur);               ///起點開始深搜
        for(i = 1; i <= num; i++)
            printf("%d ", pre[i]); ///每個節點的父節點都保存在pre數組,輸出即可
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章