POJ1258 Agri-Net MST最小生成树题解
2024-09-15 18:17:31
搭建一个最小代价的网络,最原始的最小生成树的应用。
这里使用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;
}
最新文章
- iOS使用Zbar扫描二维码
- Android开发-取消程序标题栏或自定义标题栏
- node.js的优缺点
- Managed C++中使用Nullable<;T>;
- 特效TD 的工作准则
- HDU 3853 LOOPS
- hdu5171(矩阵快速幂)
- Java文件流之练习
- 虚拟机通信配置与Xshell连接
- 解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE
- ArUco----一个微型现实增强库的介绍及视觉应用(一)
- 初始化nodejs+webpack+vuejs
- CodeForces Round #549 Div.2
- 腾讯这套SpringMvc面试题你了解多少?(面试必备)
- Java语言中的面向对象特性
- linux 目录分类与文件操作
- 改变下blog思维
- Magazine Ad CodeForces - 803D (二分+贪心)
- asp.net core 微信H5支付(扫码支付,H5支付,公众号支付,app支付)之2
- Web挂马方式整理
热门文章
- 蓝萝卜blu netty3升netty4
- python模块导入
- sql server创建外键,子母表,级联删除。
- Windows下VS2013创建与使用动态链接库(.dll)
- UVA 11125 Arrange Some Marbles
- V4L2 camera 驱动 capture测试程序【转】
- python grequests和requests比较
- Kubernetes-服务发布
- shiro配置参考(二)可以和mybatis的配置放在一个文件中(不建议这样,可以拆分开来,注意相关配置即可)
- UVA 1594:Ducci Sequence (模拟 Grade E)