MST(最小生成树)——Prim算法——HDU 1879-继续畅通工程
Prim算法很好理解,特别是学完了迪杰斯特拉算法之后,更加能理解Prim的算法思想
和迪杰斯特拉算法差不多,由于最后要形成连通图,故任意指定一个点,作为初始点,遍历所有点,以当前最小权值的点(和迪杰斯特拉不同,每个点的值就由边的权值确定)每次求出其他点的值。
在判断联通图的关系时,并查集是个十分高效的手段,通过并查集能够判断出当前是否成环(在Kruskal算法里用并查集判断是否成环非常重要),还有判断当前是否有路可通
通过HDU 1879来分析Prim算法,以及并查集在MST中的应用
Description
Input
当N为0时输入结束。
Output
Sample Input
Sample Output
#include <iostream>
#include <cstdio>
#include <cstring>
#define inf 10000000
using namespace std;
int towns[][]; //用邻接矩阵存贮图中边的权值
int lowcost[]; //存贮点的值
bool vis[];
int father[];
int findset(int x) //经典的并查集 路径压缩查找root节点,接下来要用到它
{
if (x!=father[x])
father[x]=findset(father[x]);
return father[x];
}
int main()
{
int n,m;
while (scanf("%d",&n)&&n)
{
int i,j,k;
m=n*(n-)/;
for (i=; i<=n; i++) //初始化部分,我一般首先将边和点的值全部初始化为inf
{
for (j=;j<=n;j++)
towns[i][j]=inf;
father[i]=i;
lowcost[i]=inf;
} for (j=;j<=m;j++) //读入边的权值
{
int a,b,c,d;
scanf("%d %d %d %d",&a,&b,&c,&d);
if (d==) //根据题目要求,d为1的时候代表路已经修通,故用并查集把所有修通了路的节点汇集在一个集合中
{
int root=findset(a);
int r2=findset(b);
father[r2]=root;
}
else
if (towns[a][b]>c) //有些题目会比较坑,两点之间有多条路,而且题目里面还没有任何提示,所以加上这句判断较为保险
towns[a][b]=towns[b][a]=c; //无向图,双向都要设置权值
}
lowcost[]=; //我一般设置从1点出发进行连通,故将点1的权值设置为0
memset(vis,,sizeof vis);
int ans=;
for (i=; i<=n; i++) //prim核心部分。
{
int min=inf,loc=;
for (j=;j<=n;j++) //先找出lowcost最小的点,即点权值最小的点
{
if (vis[j]||lowcost[j]==inf) continue;
if (min>lowcost[j]) min=lowcost[j],loc=j;
} vis[loc]=; //通过vis数组将已经连通且权值最小的点 设置为已访问状态。 ans+=lowcost[loc]; //prim里面点的权值和Dijstla不同,这里保存的就是连通边的权值。所以求结果的时候是累加点权值即可
for (k=;k<=n;k++)
{
if (findset(k)==findset(loc)) towns[loc][k]=;//并查集派上用场了,一旦并查为同一集合,说明路已经修好,边权值设置为0
if (k==loc||vis[k]) continue;
if (lowcost[k]>towns[loc][k]) //由当前点向其他未连通点 进行 “尝试连通”
lowcost[k]=towns[loc][k]; }
}
printf("%d\n",ans);
}
return ;
}
MST(最小生成树)——Prim算法——HDU 1879-继续畅通工程的更多相关文章
- hdu 1879 继续畅通工程
/************************************************************************/ /* hdu 1879 继续畅通工程 Time L ...
- hdu 1879 继续畅通工程 (并查集+最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1879 继续畅通工程 Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 1879 继续畅通工程 (Prim(普里姆算法)+Kruskal(克鲁斯卡尔))
继续畅通工程 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- hdu 1879 继续畅通工程 (最小生成树)
继续畅通工程 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 1879 继续畅通工程(最小生成树)
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经 ...
- HDU 1879 继续畅通工程(Kruskra)
继续畅通工程 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- hdu 1879 继续畅通工程(最小生成树,基础)
题目 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<algo ...
- HDU 1879 继续畅通工程(Prim||Kruscal模板题)
原题链接 Prim(点归并) //异或运算:相同为假,不同为真 #include<cstdio> #include<algorithm> #define maxn 105 us ...
- (step6.1.1)hdu 1879(继续畅通工程——最小生成树、kruscal)
题目大意:输入一个整数n,表示有n个村庄.在接下来的n(n-1)/2行中,每行有4个整数begin end weight flag.分别表示从begin到end之间可以连通 ,他们之间的费用为w ...
随机推荐
- Arrays类常用方法
Arrays类 3.1 概述 java.util.Arrays 此类包含用来操作数组的各种方法,比如排序和搜索等.其所有方法均为静态方法. 3.2 操作数组的方法 1.将参数数组变成字符串 publi ...
- 2.9 学习总结 之 【Android】体温统计APP
一.说在前面 昨天 学习了JQ的相关知识 今天 编写体温统计APP 我的工程源码:https://github.com/xiaotian12-call/Take-body-temperature 二. ...
- Kafka--windows下简单使用kafka命令
参考 https://www.cnblogs.com/cici20166/p/9426417.html 启动zookeeper 只需要保证有可用的zookeeper,可以使用kafka内置的,也可以自 ...
- ActiveMQ持久化机制和JMS可靠消息
1.ActiveMQ持久化机制 1.1 JDBC将数据持久化到数据库 1.2 AMQ生成日志文件 1.3 KahaDB:本次磁盘生成数据文件(默认) 1.4 LevelDB:谷歌K/V数据库 1.5 ...
- VUE- Cordova打包APP
VUE- Cordova打包APP 现在使用vue开发的项目越来越多,使用vue开发的移动端打包就成了最大的问题.现在前端打包方案有好多种,但是综合来说,我比较喜欢用cordova来进行Android ...
- kafka cmd with ssl
set PATH=C:\Program Files\Java\jdk1.8.0_201\bin;@call kafka-consumer-groups.bat --bootstrap-server l ...
- 【转载】WebDriver拾级而上·之零 WebDriver理论
Selenium2.0 = Selenium1.0 + WebDriver(也就是说Selenium2.0合并了这两个项目) Selenium1.0可以使用任何编程语言,但是有个先决条件就是必须支 ...
- Dynamic Route Matching Vue路由(1)
Dynamic Route Matching 动态的 路由 匹配 Very often we will need to map routes with the given pattern to the ...
- CCCC L3-013. 非常弹的球
题意: 刚上高一的森森为了学好物理,买了一个“非常弹”的球.虽然说是非常弹的球,其实也就是一般的弹力球而已.森森玩了一会儿弹力球后突然想到,假如他在地上用力弹球,球最远能弹到多远去呢?他不太会,你能帮 ...
- 10 ~ express ~ 使用 cookie 保存用户 信息
思维导图: (1) 保存 cookie (2)销毁 cookie 一,保存 cookie 1,app.js . 新增代码 var Cookies = require('cookies') /** * ...