hihocoder1097---最小生成树一Prim算法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//与Dijsktra思想下相同,划分两个不同集合 //区别:d[]数组含义不同,此处是到集合的最短距离 //优化方式不同的,d[v]=G[u][v]; #include<bits/stdc++.h> using namespace std; const int M=1010; const int inf=0x3fffffff; int n; int G[M][M]; int d[M]; bool vis[M]; int prim(){ fill(d,d+M,inf); fill(vis,vis+M,0); d[0]=0; int ans=0; for(int i=0;i<n;i++){ int u=-1;int Min=inf; for(int j=0;j<n;j++){ if(vis[j]== 0 && d[j]<Min){ u=j;Min=d[j]; } } if(u == -1) return -1; vis[u]=1; ans+=d[u]; for(int k=0;k<n;k++){ if(!vis[k] && G[u][k]<d[k]){ d[k]=G[u][k]; } } } return ans; } int main(){ while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ scanf("%d",&G[i][j]); } } int ans=prim(); printf("%d\n",ans); } return 0; }