举杯消愁愁更愁,月底账单入水流 • 8个月前
/*
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;
}
评论:
请先登录,才能进行评论