prim算法求最小生成树
每次利用已经加入生成树的点集寻找未加入的点集的最小边,然后添加该点,并把minw[u]设置为最小生成树到u的最小距离;
证明算法正确性;
如果存在x1 x2均能联通到达生成树,其中若minw[x2]>minw[x1]
此时选x2加入生成树一定没有选X1优,正确性可以保证;
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=5e3+5; 4 int n,m; 5 int dis[N][N]; 6 int f[N],minw[N]; 7 8 int main() 9 { 10 memset(minw,0x3f,sizeof(minw)); 11 memset(dis,0x3f,sizeof(dis)); 12 cin>>n>>m; 13 for(int i=1;i<=m;i++) 14 { 15 int u,v,w; 16 scanf("%d%d%d",&u,&v,&w); 17 dis[u][v]=min(dis[u][v],w); 18 dis[v][u]=min(dis[v][u],w); 19 } 20 minw[1]=0; 21 for(int i=1;i<=n;i++) 22 { 23 int k=0; 24 for(int j=1;j<=n;j++) 25 { 26 if(!f[j]&&minw[j]<minw[k]) 27 { 28 k=j; 29 } 30 } 31 f[k]=1; 32 for(int j=1;j<=n;j++) 33 { 34 if(!f[j]&&(dis[k][j]<minw[j]||dis[j][k]<minw[j])) 35 { 36 minw[j]=dis[k][j]; 37 } 38 } 39 } 40 int ans=0,ok=0; 41 for(int i=1;i<=n;i++) 42 { 43 if(minw[i]==0x3f3f3f3f)ok=1; 44 else ans+=minw[i]; 45 } 46 if(ok)printf("orz"); 47 else printf("%d",ans); 48 return 0; 49 }

浙公网安备 33010602011771号