时间限制:
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
-
-
深度优先搜索+邻接矩阵求解 解题思路: 1、定义一个结构体数组,按顺序存储每个城市的编号 2、讲有通路的的两个城市用邻接表表示并存储,注意两个城市之间是双向的 3、定义一个辅助数组,用来标记该城市是否被访问过,深度优先遍历已建好的邻接表 4、如果该城市可到达的第一个城市已被访问,则遍历该城市能到达的下一个城市,直到该 城市能到达的那个城市未被访问,将该城市编号存入数组,并进入下一层搜索 5、输出存储城市编号的数组 代码如下: #include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX 100001 struct node { int num; struct node *next; }Node[MAX]; int parent[MAX]; void Create(int a,int b) { struct node *p=(struct node *)malloc(sizeof(struct node)); p->num=b; p->next=Node[a].next; Node[a].next=p; } void DFS(int s,int t) { struct node *p; parent[t]=s; for(p=Node[t].next;p!=NULL;p=p->next) { if(parent[p->num]==0) DFS(t,p->num); } } int main() { int N,M,S; int a,b,j; scanf("%d",&M); while(M--) { scanf("%d%d",&N,&S); memset(Node,0,sizeof(Node)); memset(parent,0,sizeof(parent)); for(j=1;j<N;j++) { scanf("%d%d",&a,&b); Create(a,b); Create(b,a); } DFS(-1,S); for(j=1;j<N;j++) printf("%d ",parent[j]); printf("%d\n",parent[j]); } }
-
代码2:
-
#include <stdio.h> #include <string.h> int map[100005]; void Adjust(int x) { int y = map[x]; if (y != 0) { Adjust(y); map[y] = x; } } int main() { int i, N, n, s, cityA, cityB; scanf("%d", &N); while (N--) { scanf("%d%d", &n, &s); memset(map, 0, sizeof(map)); for (i = 1; i < n; i++) { scanf("%d%d", &cityA, &cityB); if (map[cityB] == 0) { map[cityB] = cityA; } else { Adjust(cityA); map[cityA] = cityB; } } Adjust(s); map[s] = - 1; for (i = 1; i <=n; i++) { printf("%d ", map[i]); } printf("\n"); } return 0; }
-
-
第一行输入一个整数M表示测试数据共有M(1<=M<=5)组