Prim模板(C++版)
阿新 • • 發佈:2018-11-02
hiho1097
Prim和Dijkstra很像,這裡也是用鄰接矩陣存的,應該也能改成堆優化的吧,然後就是鬆弛條件那裡和dijk不一樣
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+50;
const int INF=0x3f3f3f3f;
int n;
int cost[N][N];
int dis[N];
bool vis[N];
int Prim(){
int ans=0;
memset(vis,false,sizeof(vis));
vis[0]=true;
for (int i=1;i<n;i++){
dis[i]=cost[0][i];
}
for(int i=1;i<n;i++){
int Min=INF;
int k=-1;
for(int j=0;j<n;j++){
if(!vis[j] && Min>dis[j]){
k=j;
Min=dis[j];
}
}
if(k==-1){
//不連通
return -1;
}
ans+=Min;
vis[k]=true;
for(int j=0;j<n;j++){
if(!vis[j] && dis[j]>cost[k][j]){
dis[j]=cost[k][j];
}
}
}
return ans;
}
int main(void){
scanf("%d",&n);
for(int i=0; i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&cost[i][j]);
}
}
int ans=Prim();
printf("%d\n",ans);
return 0;
}