题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=20
题目分析
由最小生成树从某地出发求其访问次序。
1,怎样搜索得出次序
A:应用深搜,广搜是分层。
2,怎样深搜
A:采取递归的方法,并设置访问标记,对当前顶点的邻接顶点依次往下搜到底,到所有邻接顶点均访问结束,在回溯前一步,得到第一个顶点的下一个邻接顶点。
AC 代码:
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> a[100005];
int pre[100005];
void DFS(int cur)
{
int i;
for(i=0;i<a[cur].size();++i)
{
if(pre[a[cur][i]]) continue; //若存在父节点则遍历同行的下一元素,类似于标记,因为存在从另一顶点开始的搜索会影响父结点的值
pre[a[cur][i]]=cur; //继续深搜
DFS(a[cur][i]);
}
}
int main()
{
int test;
cin>>test;
while(test--)
{
memset(pre,0,sizeof(pre));
memset(a,0,sizeof(a));
int j,num,cur,x,y;
cin>>num>>cur;
pre[cur]=-1;
for(j=0;j<num-1;++j)
{
cin>>x>>y;
a[x].push_back(y); // 不是push
a[y].push_back(x); //push_back
}
DFS(cur);
for(int k=1;k<=num;++k)
cout<<pre[k]<<" ";
}
system("pause");
return 0;
}