AC

lzhh_lzhh26  •  1个月前


/*
1.prim算法
  1)选择任意一个点开始
  2)考虑把其他点依次加入树 
   2.2(从相邻的点中寻找)寻找所有到达已加入树的最近距离 
   2.3加入树                                                                                                                         
   2.4相邻的列表,减去那个已1选中的,然后加上选中的相邻点 
*/ 
#include<bits/stdc++.h>
using namespace std;
int d[105][105]; 
bool vis[105];		//是否已加入 
int dis[105];
int main(){
	int n;
	cin>>n;	
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cin>>d[i][j];
		}
	}
	vis[0]=true;
	int ans=0;
	dis[0]=1000000;		//自己到自己给一个很大的值 
	for(int i=1;i<n;i++){
		dis[i]=d[i][0];
	}
	for(int i=1;i<n;i++){
		int minpoint=0;
		for(int j=0;j<n;j++){
			if(dis[minpoint]>dis[j]&&!vis[j]){		//选出已加入点最短距离 
				minpoint=j;
			}
		}
		ans+=dis[minpoint];		//选最短 
		vis[minpoint]=true;
		for(int j=1;j<n;j++){
			if(!vis[j]&&dis[j]>d[minpoint][j]){
				//更新最短距离 最短距离的更新一定由新加入点引起 
				dis[j]=d[minpoint][j];		//到已加入点距离最短的点 
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

评论:

请先登录,才能进行评论