NYOJ20吝啬的国度

xiaoxiao2021-02-28  140

吝啬的国度

时间限制: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<vector> #include<string.h> using namespace std; vector<int>V[100005]; int route[100005]; int vist[100005]; void DFS(int point) { vist[point]=1; for(int i=0;i<V[point].size();i++)//访问与point相连的城市 { int v=V[point][i]; if(!vist[v]) { route[v]=point; //存储访问城市的上一站 DFS(v); } } } int main () { int N,M; int n,point; //城市数目,起点 int a,b,i; scanf("%d",&N); while(N--) { scanf("%d%d",&n,&point); for(i=1;i<=n;i++) V[i].clear(); for(i=1;i<n;i++) //输入路径 { scanf("%d %d",&a,&b); V[a].push_back(b); //push_back 在数组的最后添加一个数据 V[b].push_back(a); //a,b连通 } memset(vist,0,sizeof(vist));//访问城市 route[point]=-1; DFS(point); //输出访问城市的上一站 int one=1; for(i=1;i<=n;i++) { if(one) one=0; //第一个元素前不加空格 else printf(" "); printf("%d",route[i]); } printf("\n"); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-22053.html

最新回复(0)