本题链接http://acm.hdu.edu.cn/showproblem.php?pid=1863

 Problem Description:
  省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
 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 <iostream>
#include <algorithm>
#define maxn 105
#define INF 999999 using namespace std;
int M, N;///M是村庄数、N是道路数
bool used[maxn];
int cost[maxn][maxn];
int mincost[maxn]; int prim () {
for (int i = ; i <= M; ++i) {
mincost[i] = INF;
used[i] = false;
}
mincost[] = ;
int res = ;
while (true) {
int v = -;
for (int u = ; u <= M; ++u) {
if (!used[u] && (v == - || mincost[u] < mincost[v])) v = u;
}
if (v == -) break;
if (mincost[v] == INF) return INF;///使用这种方法检查输出"?"的情况.
used[v] = true;
res += mincost[v];
for (int u = ; u <= M; ++u) {
mincost[u] = min (mincost[u], cost[v][u]);
}
}
return res;
} int main () {
int a, b, w;
while ((cin >> N) && N ) {
// int flag = 0;
cin >> M;
for (int i = ;i <= M; ++i)
for (int j = ;j <= M; ++j)
cost[i][j] = INF;
for (int i = ; i <= N; ++i) {
cin >> a >> b >> w;
cost[b][a] = cost[a][b] = w;
}
/* for (int i = 1; i <= M; ++i){
for (int j = 1; j <= M; ++j) {
if (cost[i][j] == INF && i != j)
flag = 1;
}//一开始是用这种方法检查单独的点的,(错误)
}*/
int res = prim ();
if (res == INF)
cout << "?" << endl;
else
cout << res << endl;
}
return ;
}

  最小生成树(输出“?”技巧):在计算的时候做一个选择的点是否是正无穷的判断(如果一个点是孤立的话,当取到最后的时候会将代码中的v赋值到那个被孤立的点,那个点没有赋值权值,所以就是正无穷)。

 并查集代码:

 #include<cstdio>
#include<cstring>
#include <iostream>
#include <algorithm>
using namespace std; int pre[];
struct road { //公路的结构体
int x, y, v;
}ad[]; bool cmp(road a, road b) {
return a.v < b.v;
} int find(int x) { //寻找
if(pre[x] != x)
return pre[x] = find(pre[x]);
return pre[x];
} int mix(int x,int y) { //合并
int fx = find(x), fy = find(y);
if(fx == fy)
return ;
pre[fy] = fx;
return ;
} int main() {
int i, j, n, m;
int ans;
int count;
while(~scanf("%d%d",&m,&n)) {
if (m == )
break;
for(j = ; j < m; j++)
scanf("%d%d%d",&ad[j].x ,&ad[j].y,&ad[j].v);
for(i = ; i <= n; i++)
pre[i] = i;
ans = ;
count = ;
sort(ad, ad+m, cmp);
for(i = ; i < m; ++i) {
if(count == n - ) break;
if(mix(ad[i].x, ad[i].y)) {
++ count; /////在这里判断输出"?"的时候
ans = ans + ad[i].v;
}
}
if(count != n - )
printf("?\n");
else
printf("%d\n",ans);
}
return ;
}

  并查集(输出“?”技巧):另外定义一个变量,在计算的时候自加,最后判断和“M - 1”(M是村庄的数目)的关系,因为离散的点连成一条线之间的道路条数就是M-1。

   

   欢迎码友评论,一起成长。

<hdu - 1863> 畅通工程 并查集和最小生成树问题的更多相关文章

  1. hdu 1863 畅通工程 (并查集+最小生成树)

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

  2. hdu 1863 畅通工程 (并查集 、 kruskal)

    畅通工程Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. hdu 1863 畅通工程(Kruskal+并查集)

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. HDU 1863 畅通工程 (并查集)

    原题链接:畅通工程 题目分析:典型的并查集模版题,这里就不详细叙述了.对算法本身不太了解的可以参考这篇文章:并查集算法详解 代码如下: #include <iostream> #inclu ...

  5. 题解报告:hdu 1863 畅通工程

    Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可 ...

  6. hdu 1863 - 畅通工程(MST)

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. HDU 1863 畅通工程

    畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  8. HDU 1863 畅通工程(Prim算法求解MST)

    题目: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现 ...

  9. HDU - 1232 畅通工程-并查集模板

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...

随机推荐

  1. Django部署到Apache Web Server

    Windows环境下,将Django部署到Apache Web Server 在Windows上部署Django(用mod_wsgi)会出现各种奇怪的问题,现简单记录下配置过程及遇到的错误及解决方法. ...

  2. mvc3项目如何在IIS7.5上发布的

    若项目拿到服务器上发布,必须要安装MVC3的安装包! 1.在vs中打开你要发布的项目,右键属性找到发布 2.弹出发布web对话框,选择<新建配置文件...> 在弹出的对话框中输入一个配置文 ...

  3. SZU : A18 (Climb Well)

    Judge Info Memory Limit: 32768KB Case Time Limit: 10000MS Time Limit: 10000MS Judger: Number Only Ju ...

  4. DLL文件的引用

    首先我们先要写一个DLL文件: 我先创建一个win32的DLL工程,在工程中添加了Math.h和Math.cpp文件,具体内容如下: Math.h: #pragma once #include &qu ...

  5. ioc和aop

      IOC容器的基本原理 ioc又称为控制反转.或者依赖注入.为什么叫控制反转呢? 可以这样来看.软件开发中会有很多的类,这些类在一起完成复杂的功能.这些类之间存在了耦合的关系.就如同很多的齿轮,啮合 ...

  6. 苹果APNs’ device token特性和过期更新

    APNs全名是Apple Push Notification Service.用iPhone的应该都习惯了,每次安装完一个新应用启动后,几乎都会弹出个警告框,“XXX应用”想要给您发送推送通知.这个警 ...

  7. Controller的激活

    Controller的激活 概述 在此系列开篇的时候介绍了MVC的生命周期 , 对于请求的处理,都是将相应的类的方法注册到HttpApplication事件中,通过事件的依次执行从而完成对请求的处理. ...

  8. Java:终结器

    目录 背景Java版:终结器防卫者C#版:“终结器防卫者”备注 背景返回目录 多数情况我们不需要重写 finalize 方法,只有当我们需要持有未托管资源的时候才需要,而此时重写 finalize 方 ...

  9. easyuidatagrid扩展--玩一下,无实际意义

    直接上代码 $.extend($.fn.datagrid.defaults.editors, { operater: { init: function (container, options) { v ...

  10. wordpress开启用户注册

    很多人想用wordpress打造多用户博客平台 首先想到的是用户注册 今天搞了好长时间,找了好多资料总算找到了 首先开启用户注册 后台 ----设置----常规设置  在成员资格选项中选择任何人都可以 ...