最小生成树prim算法

#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;
} 

猜你喜欢

转载自blog.csdn.net/TDD_Master/article/details/82354254
今日推荐