hdu1102 Constructing Roads(两种基础最小生成树算法)
来源:互联网 发布:网商贷淘宝信用贷款 编辑:程序博客网 时间:2024/06/08 00:06
http://acm.hdu.edu.cn/showproblem.php?pid=1102
题意:n个村庄,给你一个矩阵代表村庄i到j的距离,求要想使所有村庄连通需要修多少长度的路。
思路:基础MST。已经给你的道路相当于这两点已经可达,那么这两点之间就不用修路,赋长度为0,对边方向性的操作同hdu1233。这一点要想清楚,不得不说图论里有些想法真的好神奇。
#include <stdio.h>#include <algorithm>#include <stdlib.h>#include <string.h>#include <iostream>#include <queue>using namespace std;typedef long long LL;const int N = 505;const int INF = 0x3f3f3f3f;int mincost[N], G[N][N], pre[N], n, ednum, sum;bool vis[N];struct node{ int u, v, w;}edge[N*N];bool cmp(node x, node y){ if(x.w<y.w) return true; else return false;}void prim(){ for(int i = 1; i <= n; i++) mincost[i] = G[1][i];//从起点到各个点的花费 memset(vis, false, sizeof(vis)); mincost[1] = 0; vis[1] = true; for(int i = 2; i <= n; i++)//起点已访问过。遍历n-1个节点 { int k = -1, minpath = INF; for(int j = 1; j <= n; j++) { if(!vis[j] && (k==-1 || mincost[j]<minpath))//寻找起点离未访问节点花费最小的点 { k = j; minpath = mincost[j]; } } if(k == -1) break;//已经遍历所有的点 vis[k] = true; sum+=minpath; for(int j = 1; j <= n; j++)//以上面找出花费最小的节点为起点更新其对其他未访问节点的最小花费 { if(!vis[j]) mincost[j] = min(mincost[j], G[k][j]); } }}int Find(int x){ int r = x; while(r != pre[r]) r = pre[r]; int i = x, j; while(pre[i] != r) { j = pre[i]; pre[i] = r; i = j; } return r;}void Union(int p1, int p2, int w){ int x = Find(p1); int y = Find(p2); if(x != y) { pre[x] = y; sum+=w; }}void kruskal(){ for(int i = 1; i <= n; i++) pre[i] = i; sort(edge+1, edge+1+ednum, cmp); for(int i = 1; i <= ednum; i++) { Union(edge[i].u, edge[i].v, edge[i].w); }}int main(){ // freopen("in.txt", "r", stdin); int u, v; while(~scanf("%d", &n)) { sum = 0; ednum = 0; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) { scanf("%d", &G[i][j]); edge[++ednum] = (struct node){i, j, G[i][j]}; } int q; scanf("%d", &q); for(int i = 1; i <= q; i++) { scanf("%d%d", &u, &v); G[u][v] = G[v][u] = 0; edge[++ednum] = (struct node){u, v, 0}; // edge[++ednum] = (struct node){v, u, 0}; } // prim(); kruskal(); printf("%d\n", sum); } return 0;}
0 0
- hdu1102 Constructing Roads(两种基础最小生成树算法)
- HDU1102 Constructing Roads(最小生成树)
- HDU1102 Constructing Roads(最小生成树)
- hdu1102 Constructing Roads (最小生成树 prim 算法)
- HDU1102 Constructing Roads(最小生成树Prim算法)
- hdu1102 Constructing Roads 最小生成树+prim
- hdu1102 Constructing Roads 最小生成树Prim
- HDU1102 Constructing Roads 最小生成树
- hdu1102 Constructing Roads 最小生成树Prim
- Hdu1102 - Constructing Roads - 最小生成树
- HDU1102 Constructing Roads 【最小生成树Prim】
- hdu1102(Constructing Roads)--prim最小生成树
- HDU1102 Constructing Roads 最小生成树
- hdu1102 Constructing Roads------最小生成树
- HDU1102 Constructing Roads (最小生成树)
- hdu1102 Constructing Roads--最小生成树prim
- hdu1102 - Constructing Roads (求最小生成树) (Prim & Kruskal)
- hdu1102 Constructing Roads (最小生成树,kruskal)
- 反射中,Class.forName和classloader的区别
- 硬盘安装黑苹果
- 校招经历-java开发面试题
- 【jzoj4888】【最近公共祖先】
- bellman-ford算法
- hdu1102 Constructing Roads(两种基础最小生成树算法)
- Handler、Looper、Message、MessageQune之间的原理
- error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”
- 并查集(Union-Find)算法介绍
- 7.Git代码<仓库基本操作>-4(自我整理) 2016/11/12
- 为什么构造函数不可以被声明为虚函数而析构函数有时候必须声明为虚函数
- Yii2 ajax验证表单输入
- 文章标题
- MySQL中的主键以及设置其自增的用法教程