吝啬的国度
时间限制: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来存可以节省很多空间。

n-1条边可以认为它是一个连通无环图,一棵树。

无根树转有根树。

深搜,用一个p数组存数每一步的父结点,visit存储该结点是否访问。

不过最后我vector没有清空,wrong answer了。

#include <iostream>
#include <cstring>
#include <vector>

using namespace std;

const int Max = 100001;
int p[Max];
int visit[Max];
vector<int> a[Max];

void dfs(int s)
{
     //cout << s<< '[';
     visit[s] = 1;
    for(int i = 0 ; i < a[s].size(); i++)
      if(a[s][i]&&!visit[a[s][i]])
      {//cout << '!';
                            
                  p[a[s][i]] = s;          
                  dfs(a[s][i]);
      }
         
}
int main()
{
    int num,n,s;
    int x,y;

    cin >> num ;
    while(num--)
    {
            memset(p,-1,sizeof(p));
            memset(visit,0,sizeof(visit));
           cin >> n >> s;
           for(int i = 0; i < n-1; i++)
            {
                   cin >> x >> y;
                   a[x].push_back(y);
                   a[y].push_back(x);
                   
            }   
    dfs(s);
for(int  i = 1; i <= n; i++)
        {cout  <<p[i] << ' ' ;a[i].clear();}
        cout << endl;
    
        
        }
        system("pause");
    return 0;
}