Kruskal/prim--最小生成树
来源:互联网 发布:电视节目片头制作软件 编辑:程序博客网 时间:2024/06/03 22:59
问题概述:已知有n个村庄以及部分村庄之间的所有公路长度,你的目标是以最短的公路使全省任意两个村庄间都可以实现公路交通,而其他公路全部废弃,求出满足条件的最短公路长度,如果没法联通,输出-1
输入样例: 对应输出:
3 7 16
1 2 19
2 3 11
3 1 7
1 3 5
2 3 89
3 1 91
1 2 32
Kruskal:
套路:按边从短到长排序,一条边一条边的往图中加,如果加完这条边之后原图中出现环,则舍弃这条边,最后形成的就是最小生成树了
原理与证明:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html
复杂度:O(mlogm)
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int ufs[1205];typedef struct{ int u;int v;int len;}Road;Road s[22222];int Find(int x);bool comp(Road a, Road b){if(a.len<b.len)return 1;return 0;}int main(void){ int n, i, t1, t2, sum, m, flag;while(scanf("%d%d", &n, &m)!=EOF){for(i=1;i<=m;i++)scanf("%d%d%d", &s[i].u, &s[i].v, &s[i].len);for(i=1;i<=n;i++)ufs[i] = -1;flag = n-1;sum = 0;sort(s+1, s+m+1, comp);for(i=1;i<=m;i++) /*使用并查集*/{t1 = Find(s[i].u);t2 = Find(s[i].v); /*如果这个公路没有必要,也就是u和v这两个村庄已经被联通了,就不修这条路*/if(t1!=t2){flag--;sum += s[i].len;ufs[t1] = t2; /*将这几个村庄依次连接*/}}if(flag==0)printf("%d\n", sum);elseprintf("-1\n");} return 0;}int Find(int x){ if(ufs[x]==-1)return x; return ufs[x] = Find(ufs[x]);}
Prim:
套路:初始化所有点都没有标记,然后标记1号点
每次找一条其中一端已经被标记而另一端没被标记的当前最短的边加入图中并标记另一端,直到所有点都被标记
复杂度:O(nm)
#include<stdio.h>#include<string.h>#include<limits.h>#include<math.h>int path[102][102] = {0}, flag[102] = {0}, closedge[102] = {0};int sum;int CreatMST(int n);int main(){ int i, x, y, n, m; scanf("%d", &n);sum = 0; for(i=1;i<=n*(n-1)/2;i++) { scanf("%d%d%d", &x, &y, &m); path[x][y] = path[y][x] = m; /*path[x][y]表示x城市到y城市的距离*/ } for(i=1;i<=n;i++) path[i][i] = INT_MAX; /*显然不可能修一条从自己城市到自己城市的路,直接设为max*/ printf("%d\n", CreatMST(n)); return 0;}int CreatMST(int n){ int i, j, x, k; flag[1] = 1; /*flag[n]==1表示第n个城市已经被连起来了,而flag[n]==0表示这个城市还是独立的*/ for(i=2;i<=n;i++)closedge[i] = path[1][i]; for(i=2;i<=n;i++) { k = INT_MAX, x = 2; for(j=2;j<=n;j++){if(flag[j]==0 && closedge[j]<k) /*看还没有修的哪一条路最短,先修那条路*/{x = j;k = closedge[j];}} flag[x] = 1; /*第x个城市连接完毕*/ sum += k; /*加上要修的路长度(最小值)*/ for(j=2;j<=n;j++) {if(flag[j]==0 && path[x][j]<closedge[j]) /*找到已经修好路的城市到j城市最短的路*/closedge[j] = path[x][j];} } return sum;}
阅读全文
1 0
- Prim、Kruskal最小生成树
- 最小生成树---Prim---Kruskal
- 最小生成树 Kruskal&&Prim
- 最小生成树 Prim Kruskal
- Kruskal/prim--最小生成树
- 最小生成树 PRIM KRUSKAL
- 最小生成树算法(prim&kruskal)
- 最小生成树poj1258 prim和kruskal
- Prim和Kruskal最小生成树
- HDU 1233 prim kruskal最小生成树
- HDU 1879 最小生成树 prim + kruskal
- 最小生成树--Prim和Kruskal算法
- 最小生成树-Kruskal算法-Prim算法
- 最小生成树(Prim和Kruskal)
- 最小生成树(Kruskal+Prim)
- HDU3371-最小生成树-Kruskal-Prim
- 最小生成树-Prim及Kruskal
- [POJ2421]最小生成树+PRIM+KRUSKAL
- Struts2
- 推荐几个网站 以后可用得到
- 项目加载编译实质性流程
- java 多态环境下对 方法和成员变量的调用
- JZOJ__Day 7:【普及模拟】max
- Kruskal/prim--最小生成树
- form表单下的button按钮会自动提交表单的问题
- Paint常用方法总结
- JZOJ 1774. 合并果子 (Standard IO)
- PAT程序设计考题——甲级1077(Kuchiguse ) C++实现
- git去除已经add index的文件
- 暑假杂感
- 作为一名及格的站长都知道内容为王,外链为皇”,一个上网站想要有一个好的排名除了要有吸惹人高质量的内容外还需要强年夜的外链。对于网站内容要环绕网站主题,若是自己文采欠好可以伪原创下,万万不要用工具伪原创
- python语言学习代码联系--small甲鱼课程学习