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 }

 

posted @ 2022-01-04 11:31  matt-11  阅读(75)  评论(0)    收藏  举报