1. 程式人生 > >Prim模板(C++版)

Prim模板(C++版)

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