畅通工程

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)的更多相关文章

  1. Kruskal HDOJ 1863 畅通工程

    题目传送门 /* 此题为:HDOJ 1233 + HDOJ 1232 */ #include <cstdio> #include <algorithm> #include &l ...

  2. hdoj 1863 畅通工程 最小生成树---prime算法

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=1863 注意有可能出现无法生成树的情况. #include <iostream> #inclu ...

  3. HDOJ 1863 prim算法 HDOJ 1879

    #include<cstdio> #include<cstring> #define inf 0xffffff ][]; int ans; void prim(int n) { ...

  4. hdoj 1863 畅通工程

    并查集+最小生成树 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. HDOJ 1863

    #include<stdio.h> #include<string.h> int father[105],depth[105]; int dist[105],map[101][ ...

  6. MST最小生成树

    首先,贴上一个很好的讲解贴: http://www.wutianqi.com/?p=3012 HDOJ 1233 还是畅通工程 http://acm.hdu.edu.cn/showproblem.ph ...

  7. 最小生成树之 prim算法和kruskal算法(以 hdu 1863为例)

    最小生成树的性质 MST性质:设G = (V,E)是连通带权图,U是V的真子集.如果(u,v)∈E,且u∈U,v∈V-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最 ...

  8. 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 ...

  9. hdu 1863 畅通工程 (并查集+最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    M ...

随机推荐

  1. 12-1 mysql的增删改减

    增加数据:insert into 表名 values('','');insert into 表名(列名) values('');注意:1.如果添加 得数据是字符串,需要加'',其他类型不要加. 2.添 ...

  2. ex26 纠正练习

    题目中给出的代码如下: def break_words(stuff): """This function will break up words for us." ...

  3. ubuntu 调整桌面图标大小

    打开文件浏览器,例如从“位置” 里打开 “主文件夹”,点 “编辑” –>“首选项”,把 “图标视图默认值” 下的“默认缩放级别” 改为 75%.现在图标大小跟WinXP 下的差不多. 或者 在 ...

  4. oc实例变量初始化方法

    1 使用实例setter方法 默认初始化方法 + setName:xxx setAge:xxx 2 使用实例功能类方法,默认初始化方法 + setName:xxx age:xxx3 使用实例初始化方法 ...

  5. Codeforces Round #156 (Div. 2)

    A. Greg's Workout 模3求和,算最大值. B. Code Parsing 最后左半部分为x,右半部分为y,那么从中间不断去掉xy,直到其中一种全部消去. C. Almost Arith ...

  6. animate.css 一些常用的CSS3动画效果

    大家已经开始在项目中使用一些CSS3动画效果了吧,这让网站在高端浏览器上看起来很上流.animate.css是一个老外做的各种CSS3动画的合集,比较全,也很炫,大家可以参考学习一下. 项目主页:ht ...

  7. nginx入门到精通目录

    1.nginx入门篇 nginx安装与基础配置 nginx优化配置分析与说明 nginx模块结构 2.nginx功能篇 配置nginx的gzip功能 配置nginx的rewrite功能 配置nginx ...

  8. jquery选择器之层级选择器

    HTML示例代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  9. MapReduce 2简介

    在Hadoop 1.0版本中,mapred.job.tracker决定了执行MapReduce程序的方式,若设置为local,则使用本地的作业运行器,若设置为主机:端口(eb179:9001),则该配 ...

  10. [翻译] WCF运行时架构

    原文地址 http://www.cnblogs.com/idior/articles/971252.html 介绍 WCF具有非常易用的编程模型,服务开发者在掌握ABC的概念后可以很容易的使用WCF去 ...