开始做深搜的题,这是一种比较常见的递归,就是直接看去的点是从那来的,标记一下避免重复搜。
深搜的注意个人认为,1,要在一定范围内一般是在递归在1e4的范围内;
2,就是要注意标记,不然也可能导致超时的;3,就是不要递归混乱了,最后就是=-=用数组存放好。尽量思路要清楚。
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
const int mx=1e6;
int a[mx];
vector <int> m[mx];
void dfs(int x)
{
for(int i=0;i<m[x].size();i++)
{
if(a[m[x][i]]==0)
{
a[m[x][i]]=x;
dfs(m[x][i]);
}
}
}
int main()
{
int t,n, s,x,y;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n,&s);
memset(a,0, sizeof(a));
a[s]=-1;
for(int i=0; i<=n;i++)
m[i].clear();
for(int i =1; i<n; i++)
{
scanf("%d%d", &x, &y);
m[x].push_back(y);
m[y].push_back(x);
}
dfs(s);
for(int i =1; i<n; i++)
{
printf("%d ",a[i]);
}
printf("%d\n", a[n]);
}
return 0;
}