Prim算法模板

本文介绍了一个基于Prim算法的最小生成树实现方法。通过使用C语言,该程序能够接收顶点数和边数作为输入,并根据输入的数据计算出最小生成树的总权重。程序首先初始化所有顶点之间的距离为无穷大,然后逐步更新各个顶点到已加入生成树的顶点集合中的最近顶点的距离。
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N=1001;
 6 const int inf=1<<29;
 7 int w[N][N];
 8 int dis[N],flag[N];
 9 int n,m,u,v,c;
10 int  prim()
11 {
12     int sum=0;//计算最小距离
13     memset(flag,0,sizeof(flag));
14     for(int i=1; i<=n; i++)
15     {
16         dis[i]=w[1][i];//把起点到每个点的距离付给dis
17     }
18     flag[1]=1;
19     for(int i=1; i<n; i++)//会更新n-1次顶点,每个点都会做一次顶点
20     {
21         int to=-1,min1=inf;
22         for(int j=1; j<=n; j++)//从起点开始找,求出各点到以找过的顶点的距离最小值
23         {
24             if(!flag[j]&&dis[j]<min1)//保证不是被使用过的顶点,重新算出此次循环的最小值
25             {
26                 to=j;//把最小值对应的点的下标记录下
27                 min1=dis[j];
28             }
29         }
30         if(to==-1) return -1;//有断点,不能到达
31         sum+=min1;
32         flag[to]=1;
33         for(int j=1; j<=n; j++)
34         {
35             dis[j]=min(dis[j],w[to][j]);//更新顶点,其中存储着最短的目前找过的顶点与各点之间的距离
36         }//这样方便以后可以直接找到与各点的最短距离,遇到回路也不怕!
37     }
38     return sum;
39 
40 }
41 int main()
42 {
43     while(scanf("%d%d",&n,&m)!=EOF)//n个顶点,m条边
44     {
45         for(int i=1; i<=n; i++) //初始化i到j点的距离为无穷大,
46         {
47             for(int j=1; j<=n; j++)
48             {
49                 w[i][j]=inf;//i到j,j到i 都要人为的付成是一样的
50             }
51         }
52         for(int i=0; i<m; i++)
53         {
54             scanf("%d%d%d",&u,&v,&c);//起点u,终点v,权值c
55             w[u][v]=w[v][u]=c;
56         }
57         printf("%d\n",prim());
58     }
59     return 0;
60 }

 

转载于:https://www.cnblogs.com/tianmin123/p/4765931.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值