NYOJ 吝啬的国度(DFS遍历最小生成树)

1
2
思路:最小生成树的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多开了一个队列,相比递归调用栈要多花费一些空间。不顾建议深搜和广搜大家都尝试一下。
4

猜你喜欢

转载自blog.csdn.net/sl_world/article/details/79721631