题目链接

http://poj.org/problem?id=1251

题意

有n个村庄,村庄之间有道路连接,求一条最短的路径能够连接起所有村庄,输出这条最短路径的长度。

思路

最小生成树问题,使用普利姆算法(Prime)或者克鲁斯卡尔算法(Kruskal)解决。

代码

Prime算法:

 #include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; const int INF = 0xfffffff;
const int N = ;
int n;
int jungle[N][N];
int dist[N]; //记录从起点到其余各点的距离并不断更新 int prime()
{
int min_edge, min_node;
for (int i = ; i < n; i++)
dist[i] = INF;
int now = ;
int ans = ;
for (int i = ; i < n - ; i++)
{
dist[now] = -; //标记结点now+'A'被访问过了
min_edge = INF;
for (int j = ; j < n; j++)
{
if (j != now && dist[j]>=)
{
if (jungle[now][j]>)
dist[j] = min(dist[j], jungle[now][j]);
if (dist[j] < min_edge)
{
min_edge = dist[j]; //选取从当前结点到其余各点的最短路径
min_node = j;
}
}
}
now = min_node;
ans += min_edge; //当前最小生成树的长度
}
return ans;
} int main()
{
//freopen("poj1251.txt", "r", stdin);
while (cin >> n && n)
{
memset(jungle, , sizeof(jungle));
for (int i = ;i < n-;i++)
{
char p, q;
int v, w;
cin >> p >> v;
for (int j = ;j < v;j++)
{
cin >> q >> w;
jungle[p - 'A'][q - 'A'] = w;
jungle[q - 'A'][p - 'A'] = w;
}
}
int ans = prime();
cout << ans << endl;
}
return ;
}

Kruskal算法:

 #include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; const int N = ;
int s[N], e[N], v[N]; //分别存储每一条路的起点、终点、长度
int p[N]; //并查集使用
int n;
int cnt; //存储有多少条路 bool cmp(int i, int j)
{
return v[i] < v[j];
} int find_root(int x)
{
if (p[x] == -)
return x;
else return find_root(p[x]);
} int kruskal()
{
memset(p, -, sizeof(p));
int r[N];
for (int i = ; i < cnt; i++)
r[i] = i;
sort(r, r + cnt, cmp); //根据路径长度v[]的大小对数组r[]排序
int ans = ;
for (int i = ; i < cnt; i++)
{
int cur = r[i];
int a = find_root(s[cur]);
int b = find_root(e[cur]);
if (a != b)
{
ans += v[cur];
p[a] = b;
}
}
return ans;
} int main()
{
//freopen("poj1251.txt", "r", stdin);
while (cin >> n && n)
{
cnt = ;
char p, q;
int nums, w;
for (int i = ; i < n - ; i++)
{
cin >> p >> nums;
for (int j = ; j < nums; j++)
{
cin >> q >> w;
s[cnt] = p - 'A';
e[cnt] = q - 'A';
v[cnt] = w;
cnt++;
}
}
int ans = kruskal();
cout << ans << endl;
}
return ;
}

poj1251 Jungle Roads(Prime || Kruskal)的更多相关文章

  1. POJ1251 Jungle Roads (最小生成树&Kruskal&Prim)题解

    题意: 输入n,然后接下来有n-1行表示边的加边的权值情况.如A 2 B 12 I 25 表示A有两个邻点,B和I,A-B权值是12,A-I权值是25.求连接这棵树的最小权值. 思路: 一开始是在做莫 ...

  2. hdoj1102 Constructing Roads(Prime || Kruskal)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1102 题意 有n个村庄(编号1~n),给出n个村庄之间的距离,开始时n个村庄之间已经有了q条路,现在需 ...

  3. HDU-1301 Jungle Roads(最小生成树[Prim])

    Jungle Roads Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total ...

  4. poj1258 Agri-Net(Prime || Kruskal)

    题目链接 http://poj.org/problem?id=1258 题意 有n个农场,现在要在n个农场之间铺设光纤使得n个农场连接起来,求铺设光纤的最短距离. 思路 最小生成树问题,使用Prime ...

  5. hdoj1879 继续畅通工程(Prime || Kruskal)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1879 思路 这题和hdoj1102很像,图中的有一些路已经修好了,对于这些已经修好的路,我们令还需要修 ...

  6. hdoj1863 畅通工程(Prime || Kruskal)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1863 思路 最小生成树问题,使用Prime算法或者Kruskal算法解决.这题在hdoj1233的基础 ...

  7. hdoj1233 还是畅通工程(Prime || Kruskal)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1233 思路 最小生成树问题,使用Prime算法或者Kruskal算法解决. 代码 Prime算法: # ...

  8. 九度OJ 1154:Jungle Roads(丛林路径) (最小生成树)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:832 解决:555 题目描述: The Head Elder of the tropical island of Lagrishan has ...

  9. POJ1251 Jungle Roads(Kruskal)(并查集)

    Jungle Roads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23882   Accepted: 11193 De ...

随机推荐

  1. MySQL学习(二)——MySQL多表

    分页操作:使用limit(参数1,参数2) 起始位置(参数1))*每页显示的条数(参数2) .分类表 create table category( cid ) primary key, cname ) ...

  2. [Luogu 3398] 仓鼠找sugar

    [Luogu 3398] 仓鼠找sugar 又是 LCA- 前两天死活写不过的一个题今天终于顺手切了. 思路嘛参考了一楼题解. 就是说,对于 a, b, c, d 四个点, 令 x = LCA(a, ...

  3. Java并发编程原理与实战三十:CountDownLatch与CyclicBarrier 区别

    相信每个想深入了解多线程开发的Java开发者都会遇到CountDownLatch和CyclicBarrier,大家也在网上看到各种介绍原理,代码的,以及他们区别(应付面试)的,但是很少能讲清楚:他们到 ...

  4. angularJS $watch $apply $digest

    看O'Reilly的书看到$watch这部分,不过没看懂,网上很多资料也含糊不清,不过还是找到了几个好的,简单记录一下. 一句话说明,$watch是用来监视变量的,好了直接上代码 <html&g ...

  5. Nginx upstream的5种权重分配方式【转】

    原文地址:Nginx upstream的5种权重分配方式 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight指定轮询几率,weig ...

  6. 【Foreign】Rectangle [KD-tree]

    Rectangle Time Limit: 50 Sec  Memory Limit: 512 MB Description Input Output Sample Input 0 4 2 0 2 1 ...

  7. springboot+mybatis使用PageHelper分页

    项目结构和spring搭建mybatis请参考springboot整合mybatis.在这个基础上配置分页. 一:导入PageHelper依赖 <dependency> <group ...

  8. javascript 中检测数据类型的方法

    typeof 检测数据类型 javascript 中检测数据类型有好几种,其中最简单的一种是 typeof 方式.typeof 方法返回的结果是一个字符串.typeof 的用法如下: typeof v ...

  9. spring-boot-CommandLineRunner

    在项目服务启动完成后就去加载一些数据 @Component public class MyStartupRunner1 implements CommandLineRunner { @Override ...

  10. 2013 NEERC

    2013 NEERC Problem A. ASCII Puzzle 题目描述:完成一个拼图. solution 暴搜,但好像挺难打的,但听说因为题目限制比较多,其实很多奇怪的情况都不存在. Prob ...