#include<iostream>
#include<vector>
#include<cstring>
#include<cstdio>
using namespace std;
vector<int> v[100005];
int pre[100005];
void dfs(int a)
{
int p;
for(int i=0;i<v[a].size();i++){ //遍历每个节点的所有子节点
p=v[a][i]; //p代表a的子节点,同理a是p的父节点(p=v[a][i])
if(pre[p]==0){ //如果pre[p]=0,就把p的父节点a赋给pre[p]
pre[p]=a; //a是p的父节点,把a存在下标p的pre[]数组里
dfs(p); //再以p为源点,开始dfs(p)
}
}
}
int main()
{
//freopen("吝啬.txt","r",stdin);
int m,n,s,i,x,y;
cin>>m;
while(m--){
memset(pre,0,sizeof(pre));
memset(v,0,sizeof(v));
cin>>n>>s;
for(i=1;i<n;i++){
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
pre[s]=-1;
dfs(s);
for(i=1;i<=n;i++)
cout<<pre[i]<<" ";
cout<<endl;
}
return 0;
}
总结:DFS。主要是搜索。
1、因为数据比较大,所以用矩阵存储所有的节点内存太大,不可行!所以得用邻接表存储,但是直接建表比较麻烦,但是用vector就比较方便多了( vector<int> v[100005] ,这样就建立了一个二维的邻接表)
2、巧用下标与元素之间的关系,详见注释。好好理解一下DFS函数,以及pre[]数组。
3、这是一个极小连通子图,即可以当做一棵树,保留每个城市的前一个城市,就是目的城市的父节点。