题目链接:点击打开链接
开始的时候,思路是有的。就是纯粹的深搜。当然广搜也是可以的。本博客仅讲解深搜用法。
由于这是一棵生成树,所以,从出发点到达每个结点的路径是唯一的。
直接深搜就可以。
需要注意的一点是,每个路径都是无向的。为此在陪送了一次WA。
#include <cstdio>
#include <cstring>
#include <stack>
#include <vector>
#include <algorithm>
#define CLR(arr,val) memset(arr,val,sizeof(arr))
using namespace std;
const int N=100003;
int n,s,ans[N];
vector<int> map[N];
int dfs(int s){
for(int i=0;i<map[s].size();i++){
if(ans[map[s][i]]==-1){
//深搜写的很好,但是不是自己写的.
ans[map[s][i]]=s;
dfs(map[s][i]);
}
}
}
int main()
{
// freopen("input.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--){
CLR(ans,-1);CLR(map,0);
int a,b;
scanf("%d%d",&n,&s);
for(int i=1;i<=n-1;i++){
scanf("%d%d",&a,&b);
map[a].push_back(b);
map[b].push_back(a);
}
dfs(s);
ans[s]=-1;
for(int i=1;i<=n;i++){
printf("%d%c",ans[i],i==n?'\n':' ');
}
}
return 0;
}
的确,深搜写的很好,不过,自己就是没有写出来。
感觉应该是,对于深搜和回溯理解的不是太深刻,自己写不出的深搜也是在情理之中的。
要多加练习,多写才能自己 写出来。