最小生成树 A - 畅通工程
dalao视频:https://www.bilibili.com/video/av4768483
https://www.bilibili.com/video/av4768483?p=2
Input测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
Output对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
Sample Input
3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
Sample Output
3
?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=111;
int n,m;
struct node
{
int from,to,cost;
}exa[maxn]; int father[maxn]; void init()
{
for(int i=1;i<=n;i++) father[i]=i;
} int findx(int x)
{
return father[x]==x?x:father[x]=findx(father[x]);
} void unite(int a,int b)
{
int x=findx(a);
int y=findx(b);
if(x==y) return ;
father[x]=y;
} bool same(int x,int y)
{
return findx(x)==findx(y);
} bool cmp(const node &a,const node &b)
{
return a.cost<b.cost;
} ll kruskal()
{
ll res=0;
sort(exa+1,exa+1+n,cmp);
for(int i=1;i<=n;i++)
{
if(same(exa[i].from,exa[i].to)) continue;
unite(exa[i].from,exa[i].to);
res+=exa[i].cost;
}
return res;
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF&&n)
{
init();
for(int i=1;i<=n;i++)
scanf("%d%d%d",&exa[i].from,&exa[i].to,&exa[i].cost);
ll res=kruskal();
for(int i=2;i<=m;i++)//判断是不是连通
{
if(!same(1,i)) res=-1;
}
if(res==-1) printf("?\n");
else printf("%I64d\n",res);
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=111;
int n,m;
struct node
{
int to;
ll cost;
node(int to,ll cost) : to(to),cost(cost){}
bool operator<(const node& a)const{
return a.cost<cost;
}
}; std::priority_queue<node>que;
std::vector<node> g[maxn]; bool vis[maxn]; ll prim()
{
ll res=0;
vis[1]=1;
for(int i=0;i<g[1].size();i++) que.push(g[1][i]);
while(que.size())
{
node e=que.top();que.pop();
if(vis[e.to]) continue;
vis[e.to]=1;
res+=e.cost;
for(int i=0;i<g[e.to].size();i++) que.push(g[e.to][i]);
}
return res;
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF&&n)
{
for(int i=0;i<=m;i++) g[i].clear();
while(que.size()) que.pop();
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
int u,v;
ll cost;
scanf("%d%d%I64d",&u,&v,&cost);
g[u].push_back(node(v,cost));
g[v].push_back(node(u,cost));
}
ll res=prim();
for(int i=1;i<=m;i++) if(!vis[i]) res=-1;
if(res==-1) printf("?\n");
else printf("%I64d\n",res);
}
return 0;
}
最小生成树 A - 畅通工程的更多相关文章
- (最小生成树) 畅通工程再续 -- HDU --1875
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1875 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- hdu 1233 (prim,最小生成树) 还是畅通工程
还是畅通工程Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- [kuangbin带你飞]专题六 最小生成树 N - 畅通工程再续
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全 ...
- HDU-1233 还是畅通工程 (prim 算法求最小生成树)
prim 算法求最小生成树 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- ACM: 继续畅通工程-并查集-最小生成树-解题报告
继续畅通工程 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Descri ...
- HDU 1875 畅通工程再续 (最小生成树)
畅通工程再续 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/M Description 相信大家都听说一个"百岛湖&q ...
- HDU1875——畅通工程再续(最小生成树:Kruskal算法)
畅通工程再续 Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当 ...
- prime算法求最小生成树(畅通工程再续)
连着做了四道畅通工程的题,其实都是一个套路,转化为可以求最小生成树的形式求最小生成树即可 这道题需要注意: 1:因为满足路的长度在10到1000之间才能建路,所以不满足条件的路径长度可以初始化为无穷 ...
- HDU1879--继续畅通工程(最小生成树)
Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计 ...
随机推荐
- SQL去除数据库表中tab、空格、回车符等特殊字符的解决方法
按照ASCII码, SELECT char(64) 例如64 对应 @,则 ), 'kk'); 则结果为 abckkqq.com 依此类推, 去掉其他特殊符号,参考ASCII码对照表, 去掉tab符号 ...
- Startup在不同环境中的处理
ASP.NET Core引进了在多种环境中对控制应用程序行为的进一步支持,例如开发环境(Development Environment).预发布环境(Staging Environment),和生产环 ...
- JQuery官方学习资料(译):$ vs $()
直到现在,我们一直是通过一个jQuery对象来调用函数的,例如: $( "h1" ).remove(); 大多数jQuery函数是通过jQuery对象调用的,这是$.fn ...
- C#判断输入的是否为数字(int.TryParse)
了解 TryParse: TryParse静态方法用来将字符串转换成对应类型的数值. 所以int.TryParse()是将字符串转换为int类型的,如果成功返回true,失败返回false. priv ...
- mybatis_09关联查询_一对一
复杂查询时,单表对应的po类已不能满足输出结果集的映射. 所以有些时候就需要关联查询_一对一:通过条件查询结果每个字段都唯一 一对一:模型里面有模型 一对多:模型里面有集合 多对多:集合里面有集合 方 ...
- Eclipse中提示svn: is already locked的解决办法
eclipse的svn提交不了,报错.提示 svn: is already locked 解决办法:右键项目-------Team------Refresh/Cleanup
- 【Redis】2、CentOS 7 上安装 redis3.2.3安装与配置
一.redis源码安装 [更正]现在最新稳定的版本已经到了3.2.8 截至到2016.8.11,redis最新稳定版本为3.2.3.本篇文章我们就以此版本为基础,进行相关的讲解. 下载redis源码, ...
- JavaScript Array常用属性和方法
Array的length属性可以通过赋值改变,但这样会导致Array原有的大小发生改变. var a = ["I", "Love", "You&quo ...
- PHP7.27: Cookie and Session
<?php // 有的浏览器不支持Cookie,这要考虑的 $cFile="count.txt"; $acctime=time(); if(file_exists($cFil ...
- 《JavaScript高级程序设计》笔记:引用类型(五)
Object类型 创建object实例方法有两种.第一种方法使用new操作符后跟object构造函数.如下: var person=new Object(); person.name="Ni ...