最小生成树(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 ...
随机推荐
- tensorflow3
参考文献:tensorflow_manual_cn.pdf 一.tensorflow和caffe对应: graph-->.prototxt定义的网络结构 session-->solver( ...
- oracle数据库--启动和关闭
oracle--启动 oracle数据库的启动过程包含3个步骤:启动实例->加载数据库->打开数据库 分步骤启动过程可以对数据库进行不同的维护操作,对应我们不同的需求. 启动模式: 1.s ...
- request获取url的方法总结
辣么多属性.方法 不用就忘了 ,当需要用的时候挠头也想不到,现在总结一下 以备用 例如:http://localhost/testweb/default.aspx 1.Request.Applic ...
- python windows终端窗口下输出编码错误
windows简体中文版下终端默认字符集gbk,执行chcp 65001临时修改字符集. 修改默认字符集:注册表HKEY_CURRENT_USER\Console项中CodePage值修改为65001
- 【转】Jquery ajax方法解析返回的json数据
转自http://blog.csdn.net/haiqiao_2010/article/details/12653555 最近在用jQuery的ajax方法传递接收json数据时发现一个问题,那就是返 ...
- CDH版本升级
近期项目中需要用oozie workflow调度hivesql,发现无法执行查询语句,见:https://community.cloudera.com/t5/Batch-Processing-and- ...
- strcat函数的使用需要注意的问题
曾被这个函数困扰了好久,然后各种假设,验证:但是最后却发现这个函数并没有什么好讲的,原来的过错一切都源于忽略了“*dst去掉\0,然后加上*src,最后返回*dst”这句话的真正含义:给*dst分配的 ...
- HSDB
select t from java.lang.Thread t $JAVA_HOME/bin/java -classpath $JAVA_HOME/lib/sa-jdi.jar sun.jvm.ho ...
- 转载-- http接口、api接口、RPC接口、RMI、webservice、Restful等概念
http接口.api接口.RPC接口.RMI.webservice.Restful等概念 收藏 Linux一叶 https://my.oschina.net/heavenly/blog/499661 ...
- 单例设计模式getInstance()
对象的实例化方法,也是比较多的,最常用的方法是直接使用new,而这是最普通的,如果要考虑到其它的需要,如单实例模式,层次间调用等等. 直接使用new就不可以实现好的设计好,这时候需要使用间接使用n ...