程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> NYOJ20 吝啬的國度 [深搜]

NYOJ20 吝啬的國度 [深搜]

編輯:C++入門知識

吝啬的國度 時間限制: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   一路深搜下去,如果碰到已有父節點,那麼該父節點不必替換,因為之前的父節點才是必經節點。   [cpp]  #include <cstdio>   #include <vector>   #include <cstring>   #define max 100000 + 2   using namespace std;      vector<int> vec[max];   int pre[max];      void DFS(int s){       for(int i = 0; i != vec[s].size(); ++i){           if(pre[vec[s][i]]) continue;           pre[vec[s][i]] = s;           DFS(vec[s][i]);       }   }      int main(){       int m, n, s, a, b;       scanf("%d", &m);       while(m--){           scanf("%d%d", &n, &s);           for(int i = 1; i < n; ++i){               scanf("%d%d", &a, &b);               vec[a].push_back(b);               vec[b].push_back(a);           }           DFS(s);           pre[s] = -1;           for(int i = 1; i <= n; ++i)               printf("%d ", pre[i]);           printf("\n");           memset(vec, 0, sizeof(vec));           memset(pre, 0, sizeof(pre));       }       return 0;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved