![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
吝啬的国度 时间限制: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; }