#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF=INT_MAX;
const ll maxn=6;
bool visit[maxn];
int dir[maxn]={0};
vector<int> path;//存取路径
int Map[maxn][maxn]={ {INF,7,4,INF,INF,INF}, //INF代表两点之间不可达
{7,INF,6,2,INF,4},
{4,6,INF,INF,9,8},
{INF,2,INF,INF,INF,7},
{INF,INF,9,INF,INF,1},
{INF,4,8,7,1,INF}
};//连通情况
ll prim(int cur){//返回最小生成树的路径和
path.clear();
path.push_back(cur);
// cout<<cur<<endl;
int res=0;
int i=0,j=0;
int root=cur;
memset(visit,0,sizeof(visit));
visit[cur]=1;
for(i=0;i<maxn;++i){
dir[i]=Map[root][i];//初始化各个点到树的长度
}
for(i=1;i<maxn;++i){
int temp=INF;
int aid;
for(j=0;j<maxn;++j){
if(!visit[j]&&dir[j]<temp){//找到到这棵树距离最小奥德点
aid=j;
temp=dir[j];
}
}
res+=temp;
visit[aid]=1;
// cout<<aid<<endl;
path.push_back(aid);
for(j=0;j<maxn;++j){//更新各个点到这棵树的路径
if(!visit[j]&&dir[j]>Map[aid][j]){
dir[j]=Map[aid][j];
}
}
}
for(int i=0;i<path.size()-1;++i)//打印路径,或者直接上面的cout就行了
cout<<path[i]<<' ';
cout<<path[path.size()-1]<<endl;
return res;
}
int main(){
//填充Map
cout<<prim(0)<<endl;
return 0;
}
最小生成树prim算法
猜你喜欢
转载自blog.csdn.net/TDD_Master/article/details/82354254
今日推荐
周排行