博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1258 Agri-Net MST最小生成树题解
阅读量:7246 次
发布时间:2019-06-29

本文共 2037 字,大约阅读时间需要 6 分钟。

搭建一个最小代价的网络,最原始的最小生成树的应用。

这里使用Union find和Kruskal算法求解.

注意:

1 给出的数据是原始的矩阵图,可是须要转化为边表示的图,方便运用Kruskal,由于须要sort

2 降低边。一个矩阵最多须要(N*N-N)>>1条边,有人讨论本题是否有向,那是无意义的。由于本题的最小生成树和方向无关。

3 使用Union find是为了推断是否有环。比原始推断快非常多。

#include 
#include
const int MAX_VEC = 101;int N; //number of verticesstruct SubSet{ int p, rank;};struct Edge{ int src, des, wei;};struct Graph{ int V, E; Edge *edge; Graph(int v, int e) : V(v), E(e) { edge = new Edge[E]; } ~Graph() { if (edge) delete[]edge; edge = NULL; }};static int cmp(const void *a, const void *b){ Edge *a1 = (Edge *) a; Edge *b1 = (Edge *) b; return a1->wei - b1->wei;}SubSet *subs;Edge *res;Graph *gra;void initResource(){ subs = new SubSet[N]; for (int i = 0; i < N; i++) { subs[i].p = i; subs[i].rank = 0; } res = new Edge[N-1];}inline void releaseResource(){ if (subs) delete [] subs; if (res) delete [] res;}int find(int node){ if (subs[node].p != node) subs[node].p = find(subs[node].p); return subs[node].p;}inline void unionTwo(int x, int y){ int xroot = find(x); int yroot = find(y); if (subs[xroot].rank < subs[yroot].rank) subs[xroot].p = yroot; else if (subs[xroot].rank > subs[yroot].rank) subs[yroot].p = xroot; else { subs[xroot].rank++; subs[yroot].p = xroot; }}int mst(){ initResource(); qsort(gra->edge, gra->E, sizeof(Edge), cmp); for (int i = 0, v = 0; i < gra->E && v < gra->V - 1; i++) { int xroot = find(gra->edge[i].src); int yroot = find(gra->edge[i].des); if (xroot != yroot) { unionTwo(xroot, yroot); res[v++] = gra->edge[i]; } } int ans = 0; for (int i = 0; i < N-1; i++) { ans += res[i].wei; } releaseResource(); return ans;}int main(){ int w; while (~scanf("%d", &N)) { gra = new Graph(N, (N*N-N)>>1); int e = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { scanf("%d", &w); if (j <= i) continue; //下三角形的值不入边 gra->edge[e].src = i; gra->edge[e].des = j; gra->edge[e++].wei = w; } } printf("%d\n", mst()); delete gra; } return 0;}

转载于:https://www.cnblogs.com/clnchanpin/p/6808341.html

你可能感兴趣的文章
Compare Version Numbers leetcode
查看>>
我的友情链接
查看>>
配置WebLogic数据源
查看>>
something about kali
查看>>
rsync数据同步工具(三)
查看>>
定义图形模板
查看>>
php生成随机数:自定义函数 randstr($length)
查看>>
python学习--random和列表
查看>>
IPV4网段划分
查看>>
解决Oracle 解决Oracle ORA-12505, TNS:listener does not currently know of SID
查看>>
详解Linux下安装配置Nginx
查看>>
Maven使用笔记一
查看>>
STL deque
查看>>
Words For Today [2011-07-08]
查看>>
图像像素的获取和操作(第三天)
查看>>
(转)Array.prototype.slice.call自解
查看>>
测试1
查看>>
使用CSS3的appearance属性改变元素的外观
查看>>
inotify + rsync 实现 linux 文件实时同步
查看>>
RecyclerView的使用,打造一个通用的Adapter
查看>>