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

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

注意:

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

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

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

#include <stdio.h>
#include <stdlib.h> const int MAX_VEC = 101;
int N; //number of vertices
struct 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;
}

最新文章

  1. iOS使用Zbar扫描二维码
  2. Android开发-取消程序标题栏或自定义标题栏
  3. node.js的优缺点
  4. Managed C++中使用Nullable&lt;T&gt;
  5. 特效TD 的工作准则
  6. HDU 3853 LOOPS
  7. hdu5171(矩阵快速幂)
  8. Java文件流之练习
  9. 虚拟机通信配置与Xshell连接
  10. 解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE
  11. ArUco----一个微型现实增强库的介绍及视觉应用(一)
  12. 初始化nodejs+webpack+vuejs
  13. CodeForces Round #549 Div.2
  14. 腾讯这套SpringMvc面试题你了解多少?(面试必备)
  15. Java语言中的面向对象特性
  16. linux 目录分类与文件操作
  17. 改变下blog思维
  18. Magazine Ad CodeForces - 803D (二分+贪心)
  19. asp.net core 微信H5支付(扫码支付,H5支付,公众号支付,app支付)之2
  20. Web挂马方式整理

热门文章

  1. 蓝萝卜blu netty3升netty4
  2. python模块导入
  3. sql server创建外键,子母表,级联删除。
  4. Windows下VS2013创建与使用动态链接库(.dll)
  5. UVA 11125 Arrange Some Marbles
  6. V4L2 camera 驱动 capture测试程序【转】
  7. python grequests和requests比较
  8. Kubernetes-服务发布
  9. shiro配置参考(二)可以和mybatis的配置放在一个文件中(不建议这样,可以拆分开来,注意相关配置即可)
  10. UVA 1594:Ducci Sequence (模拟 Grade E)