思路:最小生成树的DFS遍历,邻接矩阵容易超内存,一般用邻接表。C++用vector实现邻接表。废话不多说,直接上代码。
注:本题还有BFS做法,具体请参考吝啬的国度(BFS)
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
vector<int> G[100001];
int vis[100001];
int N,S;
void dfs(int cur){
for(int i=0;i<G[cur].size();i++)
if(vis[G[cur][i]]==0){
vis[G[cur][i]] = cur;
dfs(G[cur][i]);
}
}
int main(){
int M,x,y;
cin>>M;
while(M--){
cin>>N>>S;
memset(vis,0,sizeof(vis));
memset(G,0,sizeof(G));
for(int i=1;i<=N-1;i++){
cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
vis[S] = -1;
dfs(S);
for(int i=1;i<=N;i++)
cout<<vis[i]<<" ";
cout<<endl;
}
return 0;
}
DFS和BFS的对比:
对比可知此题对于DFS和BFS耗费时间相差无几,只是在空间复杂度上,BFS比DFS多开了一个队列,相比递归调用栈要多花费一些空间。不顾建议深搜和广搜大家都尝试一下。