最小生成树(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 ...
随机推荐
- PAT (Basic Level) Practise:1028. 人口普查
[题目链接] 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是 ...
- Jena TDB assembler syntax
1 introduction Assembler is a DSL of Jena to specify something to build, models and dataset, for exa ...
- LintCode Binary Tree Maximum Path Sum
Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. ...
- Java使用Jdbc操作MySql数据库(一)
这个示例是Java操作MySql的基本方法. 在这个示例之前,要安装好MySql,并且配置好账户密码,创建一个logininfo数据库,在数据库中创建userinfo数据表.并且在表中添加示例数据. ...
- 从头开始linux-centos
测试环境,下面二者之一CentOS-6.5-x86_64-minimal.isoCentOS-7-x86_64-Minimal-1511.iso 第一步系统检测与优化,即初始化工作,常规型的 rpm ...
- SVN错误:run 'cleanup' if it was interrupted的解决
原文转自:http://www.lxway.com/812960411.htm 今天碰到了个郁闷的问题,svn执行clean up命令时报错“Previous operation has not fi ...
- Node.js热部署方式
1. supervisor: 2. hotnode: 3. node-dev: 4. nodemon:
- Hadoop学习17--yarn配置篇-内存管理
这篇文章来自于:董的博客,记录备查 内存管理,主要是管理nodemanager上的物理内存和虚拟内存. YARN允许用户配置每个节点上可用的物理内存资源,注意,这里是“可用的”,因为一个节点上的内存会 ...
- 有关项目上潜在需要的移动端GIS系统源码整理,待后续更新
GPS Tools For Android 前言: GPS数据在做GIS开发时的一份宝贵的数据,在不侵犯他人隐私的情况下通过互联网的模式收集GPS是成本最为低廉的一种模式. 背景: 现在公司在做一个项 ...
- 文件_ _android从资源文件中读取文件流并显示的方法
======== 1 android从资源文件中读取文件流并显示的方法. 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private ...