nyoj 20 【吝啬的国度】 【DFS】
2015-09-13 09:47
405 查看
吝啬的国度
时间限制: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)样例输入
110 11 91 88 1010 38 61 210 49 53 7
样例输出
-1 1 10 10 9 8 3 1 1 8
分析:
这道题的难点就是记录路径,自己一直对记录路径方面掌握的不是很好,几乎所有的记录路径的题都不知道该怎么办。做这道题就是为了熟悉一下记录路径的方法。
代码中我们用vector 存储一个城市到另一个城市。在搜索中,我们逐个查找城市,当未找到目的地时,就记录当前所在城市的前一个城市,一次类推,记录所有城市前面的城市然后逐个输出就ok了。
代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<vector> #include<algorithm> using namespace std; const int M=100005; vector<int>aa[M]; int pp[M]; void dfs(int u,int w) { int d=aa[u].size(); for(int i=0;i<d;i++) { int v=aa[u][i]; if(v!=w) { pp[v]=u; dfs(v,pp[v]); } } } int main() { int dd; scanf("%d",&dd); while(dd--) { memset(pp,0,sizeof(pp)); memset(aa,0,sizeof(aa)); int n,foot; int a,b; scanf("%d%d",&n,&foot); for(int i=1;i<n;i++) { scanf("%d%d",&a,&b); aa[a].push_back(b); aa[b].push_back(a); } pp[foot]=-1; dfs(foot,-1); //printf("%d",pp[foot]); for(int i=1;i<=n;i++) printf("%d ",pp[i]); puts(""); } return 0; }
相关文章推荐
- 第三十六天 网络连接、单线程、多线程下载
- SVM实践
- list的独有sort
- cookie 和session 的区别详解
- 百度机试:突出重围
- IO流的学习笔记(一)
- window.onload使用指南
- 自己经常使用的一些函数
- 拷贝构造函数的参数为什么必须使用引用类型
- AVL树旋转的一点理解
- 欢迎使用CSDN-markdown编辑器
- 线程之间的通信
- 解决NAT模式,主机ping不通虚拟机
- 设计模式-01-MVC
- 【bzoj1093】【ZJOI2007】【最大半连通子图】
- NUMA的取舍与优化设置
- 【特种兵PPT教程】如何用PPT动画制作超级玛丽?
- Sort Colors
- Tomcat默认访问路径的配置
- 1.1工欲善其事-必先利其器