nyoj20吝啬的国度

吝啬的国度
时间限制: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


#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
struct edge
{
	int to;
	int next;
}str[2*100005];
int head[100005];
int ans[100005];
bool vis[100005];
void dfs(int k)
{
	int i;
	for(i=head[k];i!=-1;i=str[i].next)
	{
		if(vis[str[i].to]==0)
		{
			ans[str[i].to]=k;
			vis[str[i].to]=true;
			dfs(str[i].to);
		}
	}
}
int main()
{
	int g;
	scanf("%d",&g);
	while(g--)
	{
		memset(head,-1,sizeof(head));
		memset(ans,-1,sizeof(ans));
		memset(vis,false,sizeof(vis));
		int n,k,a,b,i;
		scanf("%d%d",&n,&k);
		for(i=1;i<=n-1;i++)
		{
			scanf("%d%d",&a,&b);
			str[i].to=b;
			str[i].next=head[a];
			head[a]=i;
			str[i+n-1].to=a;
			str[i+n-1].next=head[b];
			head[b]=i+n-1;
		}
		vis[k]=true;
		dfs(k);
		for(i=1;i<=n;i++)
			printf("%d ",ans[i]);
		printf("\n");
	}
	return 0;
}

你可能感兴趣的:(吝啬的国度)