hdu 1863 畅通工程 (最小生成树)
来源:互联网 发布:nginx下载windows 编辑:程序博客网 时间:2024/06/06 00:53
解题思路:这道题做了两次,第一次做的时候还不知道有最小生成树这种东西,以为是最短路问题,就顺着思路想,不过并没有什么结果,当时误打误撞想出了一种这种问题的解法,就是每次选取能够让这棵树延长的最短的那一条边,不过鉴于算法复杂度过高就没有实现,后来学习了最小生成树算法,现在看来这道题就很直接了,就是一个裸的Kruskal算法。这个算法的核心就在于每次选取一条既不能使图形成回路又是最短的边,也就是一个并查集的过程。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <functional>#define inf 0x3f3f3f3fusing namespace std;typedef struct P{ int point1; int point2; int val;}p;bool compare(p a,p b){ return a.val<=b.val;}p edge[10001];int city[105];int getcity(int point){ if(city[point] == point) { return point; } else { city[point] = getcity(city[point]); return city[point]; }}bool connect(int point1,int point2){ int t1,t2; t1 = getcity(point1); t2 = getcity(point2); if(t1!=t2) { city[t2] = t1; return true; } return false;}int main(){ int n,m; int i; int cnt,sum; while(cin>>n>>m && n) { cnt = 0,sum = 0; for(i=0;i<n;i++) { cin>>edge[i].point1>>edge[i].point2>>edge[i].val; } sort(edge,edge+n,compare); for(i=1;i<=m;i++)//特别注意这里的序号要从1开始,与题目要求保持一致,因为没注意这里WA了一次 city[i] = i; for(i=0;i<n;i++) { if(connect(edge[i].point1,edge[i].point2)) { cnt++; sum += edge[i].val; } if(cnt==m-1) break; } if(cnt!=m-1) cout << '?' << endl; else cout << sum << endl; } return 0;}
0 0
- 【最小生成树】hdu 1863 畅通工程
- HDU 1863 畅通工程(最小生成树)
- Hdu 1863 畅通工程【最小生成树】
- HDU 1863 畅通工程 最小生成树
- hdu 1863 畅通工程 最小生成树
- hdu 1863 畅通工程 (最小生成树)
- 最小生成树hdu 1863畅通工程
- HDU-1863-畅通工程【最小生成树】
- (最小生成树)HDU 1863 畅通工程
- HDU-1863--畅通工程---最小生成树
- HDU 1863 畅通工程【最小生成树】
- 继续畅通工程 hdu 最小生成树
- HDU 1863 畅通工程(最小生成树prim算法)
- 【最小生成树+Prim】杭电 hdu 1863 畅通工程
- 【最小生成树+kruskal】杭电 hdu 1863 畅通工程
- hdu 1863 畅通工程 (最小生成树kruskal 算法)
- HDU 1863 畅通工程 (最小生成树)
- 畅通工程(最小生成树) hdu acm 1863 c++
- Inorder Successor in BST
- 高仿- 萌聚 app。
- 谈Android模拟点击的价值和实现
- 格雷码(Gray Code)的生成
- java 集合之ArrayList集合元素重复删除
- hdu 1863 畅通工程 (最小生成树)
- 欢迎使用CSDN-markdown编辑器
- 基于Android实现保存图片到本地并可以在相册中显示出来
- JAVA学习笔记three:异常
- 产生任意数
- 【C语言】C语言概述
- lib and dll
- CSP考试 2013年12月第5题 I’m stuck! C语言实现
- 新的起点,新的开始——我又回来了