Prim算法很好理解,特别是学完了迪杰斯特拉算法之后,更加能理解Prim的算法思想

和迪杰斯特拉算法差不多,由于最后要形成连通图,故任意指定一个点,作为初始点,遍历所有点,以当前最小权值的点(和迪杰斯特拉不同,每个点的值就由边的权值确定)每次求出其他点的值。

在判断联通图的关系时,并查集是个十分高效的手段,通过并查集能够判断出当前是否成环(在Kruskal算法里用并查集判断是否成环非常重要),还有判断当前是否有路可通

通过HDU 1879来分析Prim算法,以及并查集在MST中的应用

继续畅通工程

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Submit Status

Description

省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
 

Input

测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。

当N为0时输入结束。

 

Output

每个测试用例的输出占一行,输出全省畅通需要的最低成本。
 

Sample Input

3
1 2 1 0
1 3 2 0
2 3 4 0
3
1 2 1 0
1 3 2 0
2 3 4 1
3
1 2 1 0
1 3 2 1
2 3 4 1
0
 

Sample Output

3
1
0
 
 
#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-继续畅通工程的更多相关文章

  1. hdu 1879 继续畅通工程

    /************************************************************************/ /* hdu 1879 继续畅通工程 Time L ...

  2. hdu 1879 继续畅通工程 (并查集+最小生成树)

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

  3. HDU 1879 继续畅通工程 (Prim(普里姆算法)+Kruskal(克鲁斯卡尔))

    继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  4. hdu 1879 继续畅通工程 (最小生成树)

    继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  5. HDU 1879 继续畅通工程(最小生成树)

    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经 ...

  6. HDU 1879 继续畅通工程(Kruskra)

    继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  7. hdu 1879 继续畅通工程(最小生成树,基础)

    题目 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<algo ...

  8. HDU 1879 继续畅通工程(Prim||Kruscal模板题)

    原题链接 Prim(点归并) //异或运算:相同为假,不同为真 #include<cstdio> #include<algorithm> #define maxn 105 us ...

  9. (step6.1.1)hdu 1879(继续畅通工程——最小生成树、kruscal)

    题目大意:输入一个整数n,表示有n个村庄.在接下来的n(n-1)/2行中,每行有4个整数begin  end  weight  flag.分别表示从begin到end之间可以连通 ,他们之间的费用为w ...

随机推荐

  1. 012.Oracle数据库,字符串文本大小写转换,转大写,转小写,首字母大写

    /*转大写*/ SELECT UPPER(TITLE_EN) FROM ME_EO WHERE ( ISSUE_DATE BETWEEN to_date( '2017-02-04', 'yyyy-MM ...

  2. 006-PHP检测是否为整数

    <?php function checkInteger($Number) { if ($Number > 1) { /* 整数减1仍然是整数 */ return (checkInteger ...

  3. python反序列化漏洞

    原理在网页源码中如果出现将用户输入数据进行反序列化当成参数输出时,出现漏洞,可造成任意命令执行例如网页源码try:       become = self.get_argument('become') ...

  4. Prime Ring Problem素数环(HDU1016)

    Prime Ring Problem 思路:先看成一条链,往里头填数,满足任意相邻两数和为质数(这可以打表预处理出40以内的所有质数,扩展的时候枚举),填完了后检查首尾是否满足条件.字典序可以采用扩展 ...

  5. Golang函数-函数的基本概念

    Golang函数-函数的基本概念 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数的概述 1>.函数定义语法格式 Go语言函数定义格式如下: func 函数名( 函数参 ...

  6. Codeforces735D Taxes(哥德巴赫猜想)

    题意:已知n元需缴税为n的最大因子x元.现通过将n元分成k份的方式来减少缴税.问通过这种处理方式需缴纳的税费. 分析: 1.若n为素数,不需分解,可得1 2.若n为偶数,由哥德巴赫猜想:一个大于2的偶 ...

  7. 小程序封装API

    一般我们https请求都是通过wx.request来请求,但是这种请求如果多了,页面会混乱不说,还不好管理,因此我将请求单独拎出去,方便管理,也方便后期维护. // api.js const API_ ...

  8. C++路径的整理

    写C++,路径的问题一直都让人很头疼,抽空整理一些方法:也许以后会用到: 1."./" 加不加都一样,就是指当前目录 2."../" 表示当前目录的上级目录,即 ...

  9. Typecho博客添加版权说明

    版权声明是指作品权利人对自己创作作品的权利的一种口头或书面声明,一般版权声明应该包括权利归属.作品使用准许方式.责任追究等方面的内容.诸如平时看文章时最后会有一个严禁转载的说明,其实这就是版权声明. ...

  10. java排序,效率高的是哪种排序方法

    和所有其他语言是一样的.应该还是快速排序效率最高. public static void bubbleSort(int a[]) {int len = a.length;for (int i = 0; ...