HDU 1863 畅通工程

本文深入探讨了最小生成树的概念及其应用,并详细介绍了Prim算法的实现过程和原理,通过实例展示了如何使用Prim算法解决实际问题。

最小生成树。

Prim 算法。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 
 7 int map[102][102];
 8 
 9 int prim(int n)
10 {
11     int i, j, min, sum=0;
12     int pos, vis[102], d[102];
13     memset(vis, 0, sizeof(vis));
14     for (i=1; i<=n; i++)
15         d[i]=map[1][i];
16     vis[1]=1;
17     for (i=1; i<n; i++)
18     {
19         min=10000000;
20         for (j=1; j<=n; j++)
21         {
22             if (vis[j] == 0 && min >= d[j])
23             {
24                 min=d[j];
25                 pos=j;
26             }
27         }
28         vis[pos]=1;
29         sum+=min;
30         for (j=2; j<=n; j++)
31         {
32             if (vis[j] == 0 && d[j] > map[pos][j])
33             {
34                 d[j]=map[pos][j];
35             }
36         }
37     }
38     return sum;
39 }
40 
41 int main()
42 {
43     int n, m, i, j;
44     int a, b, d, sum;
45     while(scanf("%d%d", &n ,&m) && n)
46     {
47         for (i=0; i<=m; i++)
48             for (j=0; j<=m; j++)
49                 map[i][j]=10000000;
50         for (i=0; i<=m; i++)
51             map[i][i]=0;
52         for (i=0; i< n; i++)
53         {
54             scanf("%d%d%d", &a, &b, &d);
55             map[a][b]=map[b][a]=d;
56         }
57         sum=prim(m);
58         if (sum >= 10000000) printf("?\n");
59         else
60             printf("%d\n", sum);
61     }
62 }

转载于:https://www.cnblogs.com/zrq495/archive/2012/08/06/2625668.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值