最小生成树——道路建设

题目描述:

随着如今社会的不断变化,交通问题也变得越来越重要,所以市长决定建设一些公路来方便各个城市之间的贸易和交易。虽然市长的想法很好,但是他也遇到了一般人也经常头疼的问题,那就是手头的经费有限……在规划过程中,设计师们已经预算出部分城市之间建设公路的经费需求。现在市长想知道,它能不能将他的m个城市在有限的经费内实现公路交通。如果可以的话,输出Yes,否则输出No(两个城市不一定要直接的公路相连,间接公路到达也可以。)

输入描述:

测试输入包含多条测试数据
每个测试数据的第1行分别给出可用的经费c(<1000000),道路数目n(n<10000),以及城市数目m(<100)。
接下来的n行给出建立公路的成本信息,每行给出三个整数,分别是相连的两个城市v1、v2(0<v1,v2<=m)以及建设公路所需的成本h(h<100)。

输出描述:

对每个测试用例,输出Yes或No。

示例1

输入

20 10 5
1 2 6
1 3 3
1 4 4
1 5 5
2 3 7
2 4 7
2 5 8
3 4 6
3 5 9
4 5 2

输出

Yes

示例2

输入

10 2 2
1 2 5
1 2 15

输出

Yes

备注:

两个城市之间可能存在多条线路。

方法一:Kruskal

Kruskal算法:

设G=(V,E)是无向连通带权图,V= {1,2,…,N};设最小生成树T= (V,TE)。该树的初始状态为只有n个顶点而无边的非连通图T= (V, { } ),Kruskal算法将这n个顶点看成是n个孤立的连通分支。它首先将所有的边按权值从小到大排序,然后只要T中选中的边数不到n-1,就做如下的贪心选择:在边集E中选取权值最小的边 ( i , j ),如果将边 ( i , j ) 加入集合TE中不产生回路(圈),则将边 ( i , j ) 加入边集TE中,即用边 ( i , j ) 将这两个连通分支合并连接成一个连接分支;否则继续选择下一条最短边。把边 ( i , j ) 从集合E中删去。继续上面的贪心选择,直到T中所有顶点都在同一个连通分支上为止。此时,选取到的n-1条边恰好构成G的一颗最小生成树T。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e7;
int vis[maxn],cnt,ans;
struct node{int v1;int v2;int h;
}f[maxn];
bool cmp(node a,node b)
{return a.h<b.h;
}
int find(int x)
{if(vis[x]==x){return x;}else{vis[x]=find(vis[x]);return vis[x];}
}
bool merge(int a,int b)
{int q=find(a);int p=find(b);if(p==q){return false;}else{vis[p]=q;return true;}
}
int kruskal(int n,int m)
{cnt=0;ans=0;for(int i=0;i<n;i++){if(merge(f[i].v1,f[i].v2)){ans+=f[i].h;cnt++;}if(cnt==m-1){break;}}return ans;
}
int main()
{int c,n,m;while(cin>>c>>n>>m){for(int i=0;i<maxn;i++){vis[i]=i;}for(int i=0;i<n;i++){cin>>f[i].v1>>f[i].v2>>f[i].h;}sort(f,f+n,cmp);int sum=kruskal(n,m);if(sum<=c){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}}return 0;
}

方法二:Prime

Prime算法

首先任选一个节点,把它放在集合U中,那么剩下的节点即V-U,V是图的所有顶点集合。现在只需看看连接两个集合(V和V-U)的边中,哪一条边权值最小,把那条权值最小的边关联的节点加入U集合。如此下去,直到U=V结束,选中的边和所有的节点组成的图就是最小生成树。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int c,n,m;
int lowcost[110],dp[110][110],vis[110];
int prime()
{memset(vis,0,sizeof(vis));int sum=0,min,minid;vis[1]=1;for(int i=2;i<=m;i++){lowcost[i]=dp[1][i];}for(int i=2;i<=m;i++){min=inf;minid=0;for(int j=2;j<=m;j++){if(vis[j]==0&&lowcost[j]<min){min=lowcost[j];minid=j;}}sum+=min;vis[minid]=1;for(int j=2;j<=m;j++){if(vis[j]==0&&lowcost[j]>dp[minid][j]){lowcost[j]=dp[minid][j];}}}return sum;
}
int main()
{while(cin>>c>>n>>m){memset(dp,inf,sizeof(dp));int v1,v2,h;for(int i=0;i<n;i++){cin>>v1>>v2>>h;if(dp[v1][v2]>h){dp[v1][v2]=dp[v2][v1]=h;}}int ans=prime();if(ans<=c){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}}return 0;
}

最小生成树——道路建设相关推荐

  1. 道路建设(最小生成树)

    道路建设问题是牵扯最小生树的算法,但是根据具体的情况有时并不需要真的去生成树,这道题就是这样,我们只需要标记哪些地点已经连接.这次的代码使用的是点贪心(prim算法),相对而言更简单实现,边贪心(kr ...

  2. 洛谷——P2872 [USACO07DEC]道路建设Building Roads

    P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...

  3. 【道路建设——Prim】

    道路建设 文章目录 道路建设 题目描述 输入描述: 输出描述: 示例 AC代码: 总结 题目描述 随着如今社会的不断变化,交通问题也变得越来越重要,所以市长决定建设一些公路来方便各个城市之间的贸易和交 ...

  4. USACO07DEC道路建设Building Roads(prim算法+堆优化与Kruskal+路径压缩对比)

    目录 primprimprim算法 KruskalKruskalKruskal算法 P2872 [USACO07DEC]道路建设Building Roads 4 1 1 1 3 1 2 3 4 3 1 ...

  5. 问题 B: 道路建设 (Ver. I)

    问题 B: 道路建设 (Ver. I) 题目描述 有N个村庄,编号从1到N,你应该建造一些道路,使每个村庄都可以相互连接. 两个村A和B是相连的,当且仅当A和B之间有一条道路,或者存在一个村C使得在A ...

  6. POJ--3352 道路建设

    POJ–3352 道路建设 题目描述 输入样例1 10 12 1 2 1 3 1 4 2 5 2 6 5 6 3 7 3 8 7 8 4 9 4 10 9 10 输出样例1 2 输入样例2 3 3 1 ...

  7. C/C++数据结构——道路建设(最小生成树Prim)

    题目描述 随着如今社会的不断变化,交通问题也变得越来越重要,所以市长决定建设一些公路来方便各个城市之间的贸易和交易.虽然市长的想法很好,但是他也遇到了一般人也经常头疼的问题,那就是手头的经费有限--在 ...

  8. 牛客 NC15108 道路建设

    题目描述 随着如今社会的不断变化,交通问题也变得越来越重要,所以市长决定建设一些公路来方便各个城市之间的贸易和交易.虽然市长的想法很好,但是他也遇到了一般人也经常头疼的问题,那就是手头的经费有限--在 ...

  9. nowcoder 道路建设

    链接:https://www.nowcoder.com/acm/contest/76/B 来源:牛客网 题目描述  随着如今社会的不断变化,交通问题也变得越来越重要,所以市长决定建设一些公路来方便各个 ...

最新文章

  1. LeetCode:937. Reorder Log Files
  2. ffmpeg 编译安装 ubuntu18.04 4.1
  3. ktor框架用到了netty吗_如何使用 Ktor 快速开发 Web 项目
  4. 用UI讲故事,表达情感和创造个性
  5. 《Agile Impressions》作者问答录
  6. 微型计算机使用的普通编码是,2017计算机一级考试选择题练习及答案(2)
  7. path环境变量丢失恢复
  8. mcq 队列_MCQ | 8086微处理器中的寻址模式
  9. pytorch torch.normal
  10. makefile初步制作,arm-linux- (gcc/ld/objcopy/objdump)详解
  11. 学会这几点,你会成为一名月薪过万的Java程序员
  12. 图片不能置于底层怎么办_excel如何设置图片置于底层
  13. 网页效果图设计之色彩配色索引
  14. 前世回忆:放生洒甘露水的重要
  15. SETCPU超频使用教程
  16. ever 逾期_4ever的完整形式是什么?
  17. 几万年前,有一只猴子大闹地府后删库跑路
  18. php微信支付na,PHP公众号支付宝支付实现
  19. 预告 | 10月北京,工信部人才交流中心5G行业应用系列培训全面开启
  20. echarts高度自适应

热门文章

  1. JVM类加载机制(算是白话)有问题欢迎评论
  2. 计算机系lol口号,lol战队口号大全
  3. 计算机26字母代码表,在英文中的26个字母里,每一个字母所对应的“0和1”所组成的代码是多少?...
  4. c语言自带函数游戏,c语言消除游戏(带排行榜)
  5. 程序数据集散地:数据库(2)
  6. go panic recover 思考
  7. 手机在网状态查询api接口详解
  8. 评价算法的优劣标准有什么?
  9. 如何在SATA驱动装WinPE
  10. Scala解码base64编码的URL提示Last unit does not have enough valid bits