畅通工程

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. IOS 在控制器间跳转实现过渡动画

    已经掌握了CALayer下的CATransition动画在同一个控制器下实现,但是在不同控制器间跳转又该如何实现呢? MyViewController *myVC = [[MyViewControll ...

  2. 用python+selenium将腾讯首页今日话题的内容自动发表到自己cnblog里

    目的:使用pyhton下的unittest单元测试框架并结合selenium的webdriver来实现将腾讯首页的今日话题下的内容自动发表达到自己的cnblog里. 思路:创建QQDailyTopic ...

  3. 如何让LinearLayout也有类似Button的点击效果?

    有的时候,我们希望LinearLayout布局也有点击的效果,这时候我们不仅需要一个作为背景的selector,还要设置一些其它属性才行: android:clickable="true&q ...

  4. 收集的maven 仓库地址(maven repository)

    maven 仓库地址: 共有的仓库http://repo1.maven.org/maven2/http://repository.jboss.com/maven2/http://repository. ...

  5. JS 点击复制Copy (share)

    分享自:http://www.cnblogs.com/athens/archive/2013/01/16/2862981.html 1.实现点击按钮,复制文本框中的的内容 1 <script t ...

  6. rsync异机备份

    参考http://www.cnblogs.com/itech/archive/2009/08/10/1542945.html 1.服务器 新建/etc/rsyncd.conf  ->新建/etc ...

  7. (转)几种范数的解释 l0-Norm, l1-Norm, l2-Norm, … , l-infinity Norm

    几种范数的解释 l0-Norm, l1-Norm, l2-Norm, - , l-infinity Norm from Rorasa's blog l0-Norm, l1-Norm, l2-Norm, ...

  8. python笔记集合

    1.win_64下编译pyd(编译器用的tdm-gcc-5.1) gcc test.c -shared -Ic:\Python27\include -Lc:\Python27\libs -lpytho ...

  9. asp.net使用My97 Date Picker时设置默认起始时间为n年之前的今天

    可以使用My97 Date Picker组件来收集用户输入的日期值. 首先下载该组件:http://www.my97.net/dp/index.asp放到自己的项目中. 然后在项目里面引用js和css ...

  10. javascript_获取浏览器属性

    navigator.appName:浏览器名称: navigator.appVersion:浏览器版本: navigator.language:浏览器设置的语言: navigator.platform ...