最小生成树专题
2016-01-03 17:24
232 查看
一 Prim算法
POJ 1258
Kruskal算法图解
#include <iostream> #include <algorithm> using namespace std; const int NODE_NUM = 102; int father[NODE_NUM]; int n, ne; struct edge { int u,v,w; }; edge e[NODE_NUM*NODE_NUM]; bool cmp(const edge& a, const edge& b) { return a.w<b.w; } void make_set() { for (int i = 1; i <= n; ++i) father[i] = i; } int find_set(int i) { if (father[i] != i){ father[i] = find_set(father[i]); } return father[i]; } bool union_set(int a, int b) //a --> b { a = find_set(a); b = find_set(b); if (a != b){ //没有共同祖先,说明没有形成回路 father[a] = b; //将节点纳入最小生成树集合 return true; } else{ return false; } } int kruskal() { int i, mst_edge = 0, sum = 0; make_set(); sort(e, e+ne, cmp); //将边按升序排序 for (i = 0; i < ne; ++i)//如果加入的边不会使树形成回路 { if (union_set(e[i].u, e[i].v)) { sum += e[i].w;//如果纳入的边数等于顶点数-1,则说明最小生成树形成 if (++mst_edge == n - 1) { return sum; } } } return mst_edge; } int main() { int i, j, cost; while (scanf("%d", &n) != EOF) { ne = 0; for (i = 1; i <= n; ++i) { for (j = 1; j <= n; ++j) { scanf("%d", &cost); if (i != j) { e[ne].u = i; e[ne].v = j; e[ne++].w = cost; } } } printf("%d\n", kruskal()); } return 0; }
POJ 1258
Kruskal算法图解
相关文章推荐
- 怎样获取浏览器上次的会话数据(session)
- React 根据官方总结的规范
- To Learn
- 蓝桥杯 历届试题 核桃的数量(求三个数的最小公倍数)
- linq to sql 提高性能的5种方式
- 微信公众平台开发 OAuth2.0网页授权认证
- HTML学习笔记——各种居中对齐
- LeetCode - Maximal Rectangle
- leetcode第9题——*Palindrome Number
- George and Sleep
- view的封装,xib和stroryBoard加载及使用
- 学过JDBC才知道前一篇文章的经历完全可以避免。。。
- CentOS7中自编的一个支持suid的system函数(c语言)
- Python—装饰器
- String类之indexOf--->查找某字对应的位置
- FPGA笔记 AS和JTAG下载方式区别
- java学习细节知识点总结
- java中开发工具版本不对造成的后果之一
- [Leetcode]3. Longest Substring Without Repeating Characters
- 2015前端生态发展回顾