吝啬的国度
时间限制: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
-
深搜 基本代码:(这个代码用的二维数组过不了因为城市个数最多可达到100000,ac代码在后面。声明 两个代码里面的二维map含义不一样)
-
//这个代码思路是对的,就是该题范围过大,我用map来表示两城市是否有路 #include<stdio.h> #include<string.h> #define max 10000+10//范围太大 int set[max],map[max][max]; int city,start; void dfs(int num) { int i,j; for(i=1;i<=city;i++) { if(map[num][i]&&set[i]==0)//有路 且没有父节点 { set[i]=num; dfs(i);//继续搜索 } } } int main() { int t,i,j,a,b; scanf("%d",&t); while(t--) { scanf("%d%d",&city,&start); memset(set,0,sizeof(set));//初始化 memset(map,0,sizeof(map)); for(i=1;i<city;i++) { scanf("%d%d",&a,&b); map[a][b]=map[b][a]=1; } dfs(start); set[start]=-1; for(i=1;i<=city;i++) { if(i>1) printf(" "); printf("%d",set[i]); } printf("\n"); } return 0; }
-
ac:
-
//借用vector STL容器 /*用map[i][0--最大下标]来记录与城市i 有连接路的城市 对照题给的数据来理解map[1][0]=9,map[1][1]=8, 含义:与城市1有连接路的第0个城市为城市9,第1个城市为城市8 */ #include<stdio.h> #include<iostream> #include<vector> #include<string.h> #define max 100000+10 using namespace std; vector<int>map[max]; int set[max]; int city,start; void dfs(int num) { int i,j; for(i=0;i<map[num].size();i++) { if(set[map[num][i]]==0)//不存在父节点 { set[map[num][i]]=num; dfs(map[num][i]); } } } int main() { int t,i,j,a,b; scanf("%d",&t); while(t--) { scanf("%d%d",&city,&start); memset(map,0,sizeof(map)); memset(set,0,sizeof(set));//初始化 for(i=1;i<city;i++) { scanf("%d%d",&a,&b); map[a].push_back(b); map[b].push_back(a); } dfs(start); set[start]=-1; for(i=1;i<=city;i++) { if(i>1) printf(" "); printf("%d",set[i]); } printf("\n"); } return 0; }
- 第一行输入一个整数M表示测试数据共有M(1<=M<=5)组