图结构练习——最小生成树
2015-08-06 10:19
381 查看
题目描述
有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。输入
输入包含多组数据,格式如下。第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n <= 100, m <=1000)
剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。
输出
每组输出占一行,仅输出最小花费。示例输入
3 2 1 2 1 1 3 1 1 0
示例输出
2 0
///用普里姆算法基本模板
#include<stdio.h> #include<string.h> #define N 101 #define MaxInt 0x3f3f3f3f int map ,low ,visited ,m; int n; void prim() { int i,j,pos,min,result=0; memset(visited,0,sizeof(visited)); visited[1]=1; pos=1; for(i=1;i<=n;i++) { if(i!=pos) low[i]=map[pos][i]; } for(i=1;i<n;i++) { min=MaxInt; for(j=1;j<=n;j++) { if(visited[j]==0 && min>low[j]) { min=low[j]; pos=j; } } result+=min; visited[pos]=1; for(j=1;j<=n;j++) { if(visited[j]==0 && low[j]>map[pos][j]) low[j]=map[pos][j]; } } printf("%d\n",result); } int main() { int i,j; int a,b,c; while(~scanf("%d %d",&n,&m)) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { map[i][j]=MaxInt; if(i==j) map[i][j]=0; } } for(i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c) { map[a][b]=c; map[b][a]=c; } } prim(); } return 0; }
相关文章推荐
- 使用Spring Boot快速构建应用
- cakePHP模型内置回调函数afterFind()的使用。
- 遍历Map和List的几种方法和性能比较
- POJ 1258:Agri-Net Prim最小生成树模板题
- 南邮 OJ 1627 语言识别问题
- CentOS下创建配置RAID1
- MySQL--用户管理和权限
- Leetcode42 Trapping Rain Water
- Hdu 5351 MZL's Border 2015ACM多校对抗赛第五场
- hi3516a之交叉编译rtmpdump
- 可重入函数与不可重入函数
- 【采集层】Kafka 与 Flume 如何选择
- Java 并发工具包 java.util.concurrent 用户指南
- spinner选择图像的简单应用
- 《手把手教你学51单片机-C语言》之十一--------UART串口通信
- FireFox 下selected = selected失效
- C#下没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
- 【转】测试思想-测试设计 精简测试用例编写
- C# ActiveX开发及安装部署