最小生成树(HDOJ 1863)
畅通工程
http://acm.hdu.edu.cn/showproblem.php?pid=1863
1.Prim算法:
Prim算法是由一个点(最初的集合)向外延伸,找到与集合相连权值最小的边,
然后把对应顶点拉到集合里,直到所有的顶点全部在集合里为止。
Prim算法的演示如下:
http://sjjp.tjuci.edu.cn/sjjg/DataStructure/DS/web/flashhtml/prim.htm
#include <stdio.h>
const int INF=;
const int MAXV=;
int map[MAXV][MAXV];
int res;
void Prim(int map[MAXV][MAXV],int numV)
{
int i,j,k;
int lowcost[MAXV];
lowcost[]=; //顶点1已经在集合里
for(i=;i<=numV;i++)
{
lowcost[i]=map[][i]; //lowcost[]里存储的是当前集合相连的所有边的权值
}
for(i=;i<=numV;i++) //依次循环除1以外的其余点,把它拉集合里
{
int min=INF;
k=; //k初始化为1,是为了避免下一个循环里的k=j没执行,k为任意值,lowcost[k]数组溢出
for(j=;j<=numV;j++)
{
if(lowcost[j]!=&&lowcost[j]<min) //查找集合外与集合相连的点
{
min=lowcost[j];
k=j;
}
}
res+=min;
lowcost[k]=; //lowcost[k]=0表示顶点k被拉到集合里
for(j=;j<=numV;j++)
{
if(lowcost[j]!=&&map[k][j]<lowcost[j])
{
lowcost[j]=map[k][j];
} //顶点k加入集合后,集合发生变化,更新与集合相连边的权值
}
}
}
int main()
{
int n,m,i,j;
int begin,end,w;
while(scanf("%d%d",&n,&m)!=EOF&&n)
{
for(i=;i<=m;i++)
{
for(j=;j<=m;j++)
{
if(i==j)
map[i][j]=;
if(i!=j)
map[i][j]=INF;
} //创建邻接矩阵
}
for(i=;i<=n;i++)
{
scanf("%d%d%d",&begin,&end,&w);
map[begin][end]=w;
map[end][begin]=w;
}
res=;
Prim(map,m);
if(res>INF) //表示lowcost里还有INF,即图不连通
printf("?\n");
else
printf("%d\n",res);
}
return ;
}
2.Kruskal算法
Kruskal算法是先将所有的边按权值从小到大排序,在依次加边,
直到加了(顶点数-1)条边。注意:加边时避免出现环。
#include <stdio.h>
#include <stdlib.h>
struct node
{
int begin;
int end;
int w;
};
node edge[];
int res,count;
int cmp(const void *p1,const void *p2)
{
return (*(node*)p1).w-(*(node*)p2).w;
}
int Find(int *parent,int f)
{
while(parent[f]!=f)
f=parent[f];
return f;
} //寻找根节点,有点类似于并查集
void Kruskal(int numV,int numE)
{
int n,m,i;
int parent[];
for(i=;i<=numV;i++)
parent[i]=i;
for(i=;i<numE;i++)
{
n=Find(parent,edge[i].begin);
m=Find(parent,edge[i].end);
if(n!=m)
{
parent[n]=m;
count++;
res+=edge[i].w;
}//如果一条边的两个端点的的节点相同,加上这条边后就出现环
}
}
int main()
{
int n,m,i;
while(scanf("%d%d",&n,&m)!=EOF&&n)
{
for(i=;i<n;i++)
{
scanf("%d%d%d",&edge[i].begin,&edge[i].end,&edge[i].w);
}
qsort(edge,n,sizeof(edge[]),cmp);
res=count=;
Kruskal(m,n);
if(count<m-) //加入的边数<顶点数-1,说明图不连通
printf("?\n");
else
printf("%d\n",res);
}
return ;
}
小结:Prim算法是基于顶点来加边,而Kruskal算法是基于边
最小生成树(HDOJ 1863)的更多相关文章
- Kruskal HDOJ 1863 畅通工程
题目传送门 /* 此题为:HDOJ 1233 + HDOJ 1232 */ #include <cstdio> #include <algorithm> #include &l ...
- hdoj 1863 畅通工程 最小生成树---prime算法
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1863 注意有可能出现无法生成树的情况. #include <iostream> #inclu ...
- HDOJ 1863 prim算法 HDOJ 1879
#include<cstdio> #include<cstring> #define inf 0xffffff ][]; int ans; void prim(int n) { ...
- hdoj 1863 畅通工程
并查集+最小生成树 畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDOJ 1863
#include<stdio.h> #include<string.h> int father[105],depth[105]; int dist[105],map[101][ ...
- MST最小生成树
首先,贴上一个很好的讲解贴: http://www.wutianqi.com/?p=3012 HDOJ 1233 还是畅通工程 http://acm.hdu.edu.cn/showproblem.ph ...
- 最小生成树之 prim算法和kruskal算法(以 hdu 1863为例)
最小生成树的性质 MST性质:设G = (V,E)是连通带权图,U是V的真子集.如果(u,v)∈E,且u∈U,v∈V-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最 ...
- poj 1251 poj 1258 hdu 1863 poj 1287 poj 2421 hdu 1233 最小生成树模板题
poj 1251 && hdu 1301 Sample Input 9 //n 结点数A 2 B 12 I 25B 3 C 10 H 40 I 8C 2 D 18 G 55D 1 E ...
- hdu 1863 畅通工程 (并查集+最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others) M ...
随机推荐
- 第三个Sprint冲刺第六天
讨论地点:宿舍 讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论问题:研究一下有趣的东西
- Why one-norm is an agreeable alternative for zero-norm?
[转载请注明出处]http://www.cnblogs.com/mashiqi Today I try to give a brief inspection on why we always choo ...
- linux dns 连外网
以下设置对所用的Linux系统如Redhat/Ubuntu/Debian/CentOS等都有效,但您必须是管理员root或者具有管理员权限 vim /etc/resolv.conf 在其中加入: na ...
- 面试题一 链表中倒数第k个结点
void findLastK(LinkedNode head, int k, int n){ if (head == NULL || k == 0) return; LinkedNode t1 = h ...
- day17算法
http://www.360doc.com/content/14/0804/11/1073512_399302715.shtml
- 利用Jquery实现页面上div的拖动及位置保存
<script src="js/jquery.js.js" type="text/javascript"></script> <s ...
- js响应HTML客户端下拉列表的修改事件
这个案例对经常写前端程序的人来讲应该比较简单,不过像我这种习惯于后台开发,对前端不熟悉的人来说,还是有参考意义的. 在asp.net里面,经常需要响应下拉列表DropDownList的Selected ...
- CSS 知识点
1:display:block:比较常用于<a><span>这两个标签——因为这两个标签非块元素,如果不用display:block定义一下,因为a标签没有结构,就是没有宽高, ...
- [zz] demand require request用法辨析
http://zhidao.baidu.com/link?url=9Q50HiOF1fWav1nSnREbc_H1jTuAHxAjeVLbZoB5bGO3ZehPxLhQdob4oGO3slMRl0W ...
- 关于动态生成data组件
/*! * WeX5 v3 (http://www.justep.com) * Copyright 2015 Justep, Inc. * Licensed under Apache License, ...