ACM/ICPC 之 Kruskal范例(ZOJ1203-POJ1861(ZOJ1542))
两道最小生成树范例,Kruskal解法-以边为主体扩展最小生成树,需要利用并查集。
ZOJ1203-Swordfish
题意:求n个给定平面坐标的城市中的一条平面距离上的最短路长(保留两位小数)
题解:这道题数据不是很大,用Kruskal和Prim等算法都能够做。
Kruskal的算法思路是以边为主体扩展结点,即先选取权值最少的边,将两个不连通的端点加入到同一集合中(使其连通),舍去该边,接着找权值次小的,以此类推...
如果两个端点连通,则直接舍去该边。
因此可以先将所有边依据权值大小排序后,然后依次查找即可,为了较快地表示两个端点连通(属于同一集合),需要用到并查集的路径压缩。
//剑鱼行动-Kruskal
//找出n个给定平面坐标的城市中的一条最短路长(保留两位小数)
//Time:0Ms Memory:432K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std; #define MAX 101
#define POW2(x) ((x)*(x)) struct City {
double x, y;
}c[MAX]; struct Edge {
int u, v; //端点
double road;
friend bool operator < (Edge e1, Edge e2) { return e1.road < e2.road; }
}e[MAX*MAX]; int n, m;
int fa[MAX];
double minroad; int Find(int x)
{
return fa[x] < ? x : fa[x] = Find(fa[x]); //查根+路径压缩
} //加权法则合并
void Union(int r1,int r2)
{
int num = fa[r1] + fa[r2]; //集合元素总数-以负数计数
if (fa[r1] > fa[r2]) //r2集合元素多
{
fa[r1] = r2;
fa[r2] = num;
}
else { //r1集合元素多
fa[r2] = r1;
fa[r1] = num;
}
} void kruskal()
{
minroad = ;
memset(fa, -, sizeof(fa));
int num = ; //已用结点数
for (int i = ; i < m; i++)
{
int r1 = Find(e[i].u);
int r2 = Find(e[i].v);
if (r1 == r2) continue;
minroad += e[i].road;
Union(r1, r2);
num++;
if (num == n - ) break;
}
} int main()
{
int cas = ;
while (scanf("%d", &n), n)
{
for (int i = ; i < n; i++)
scanf("%lf%lf", &c[i].x, &c[i].y); m = ;
for (int i = ; i < n; i++)
for (int j = i + ; j < n; j++)
{
double d = sqrt(POW2(c[i].x - c[j].x) + POW2(c[i].y - c[j].y));
e[m].road = d;
e[m].u = i;
e[m++].v = j;
} sort(e, e + m); kruskal();
if (cas) printf("\n"); //博主在此PE过= =
printf("Case #%d:\n", ++cas);
printf("The minimal distance is: %.2lf\n", minroad);
} return ;
}
POJ1861(ZOJ1542)-Network
题意:找出可连通网络中最长的网线长度在所有方案中最小的方案,依次输出使用的最长边长,边数及各边端点信息,Special Judge
题解:Sample貌似有可能是是在提醒Special Judge,也有可能是出错了,但是这个Sample确实有点...误导人...
读英文需要注意理解题意 //the maximum length of a single cable is minimal.
其实就是在求一个最小生成树,思路参照上题,注意记录使用过的边。
//Kruskal-除了样例和英文有点坑
//Time:79Ms Memory:348K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; #define MAXN 1005
#define MAXM 15005 struct Edge {
int u, v;
int d;
friend bool operator < (Edge e1, Edge e2) { return e1.d < e2.d; }
}e[MAXM]; int n, m;
int fa[MAXN];
int used[MAXN]; //记录使用过的边 //路径压缩+查父
int Find(int x)
{
return fa[x] < ? x : fa[x] = Find(fa[x]);
} //加权合并
void Union(int r1,int r2)
{
int num = fa[r1] + fa[r2];
if (fa[r1] < fa[r2])
{
fa[r2] = r1;
fa[r1] = num;
}
else {
fa[r1] = r2;
fa[r2] = num;
}
} void kruskal()
{
memset(fa, -, sizeof(fa));
int sum = ;
int i = ;
for (; i < m; i++)
{
int r1 = Find(e[i].u);
int r2 = Find(e[i].v);
if (r1 == r2) continue;
Union(r1, r2);
used[sum++] = i;
if (sum == n - ) break;
}
printf("%d\n", e[i].d);
printf("%d\n", sum);
for (int j = ; j < sum; j++)
printf("%d %d\n", e[used[j]].u, e[used[j]].v);
} int main()
{
scanf("%d%d", &n, &m);
for (int i = ; i < m; i++)
scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].d);
sort(e, e + m);
kruskal(); return ;
}
ACM/ICPC 之 Kruskal范例(ZOJ1203-POJ1861(ZOJ1542))的更多相关文章
- ACM/ICPC 之 Prim范例(ZOJ1586-POJ1789(ZOJ2158))
两道Prim解法范例题型,简单的裸Prim,且两题相较以边为重心的Kruskal解法而言更适合以点为重心扩展的Prim解法. ZOJ1586-QS Network 题意:见Code 题解:直接的MST ...
- ACM/ICPC 之 Floyd范例两道(POJ2570-POJ2263)
两道以Floyd算法为解法的范例,第二题如果数据量较大,须采用其他解法 POJ2570-Fiber Network //经典的传递闭包问题,由于只有26个公司可以采用二进制存储 //Time:141M ...
- ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)
两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory ...
- ACM/ICPC 之 BFS范例(ZOJ2913-ZOJ1136(POJ1465))
通过几道经典BFS例题阐述BFS思路 ZOJ2913-Bus Pass 题意:找一个center区域,使得center到所有公交线路最短,有等距的center则输出id最小的. 题解:经典的BFS,由 ...
- ACM/ICPC 之 DFS范例(ZOJ2412-ZOJ1008)
通过几道例题简单阐述一下DFS的相关题型 ZOJ2412-Farm Irrigation 直观的DFS题型,稍加变化,记录好四个方向上的通路就能够做出来 题目和接水管类似,问最少要灌溉几次,即求解最少 ...
- 2014嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛
比赛链接: http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/36 题目来源: 2014嘉杰信息杯ACM ...
- ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))
祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...
- ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 G. Garden Gathering
Problem G. Garden Gathering Input file: standard input Output file: standard output Time limit: 3 se ...
- ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 D. Delay Time
Problem D. Delay Time Input file: standard input Output file: standard output Time limit: 1 second M ...
随机推荐
- Jedis 例子(demo)大全
第一步:到git下载jedis源码,如果你用maven或者gradle,那么直接下官方的即可,地址:https://github.com/xetorthio/jedis:如果你用ant,下载这个:ht ...
- DigitalOcean 建站笔记
由于在默认的情况下digitalocean的VPS没有设置swap分区,用df -h命令查看的话,整个VPS上只有一个20G的分区.用free命令查看的话,swap分区的大小是0,增加swap分区的命 ...
- jQuery.validator 详解二
前言:上一篇详细的介绍了jQuery.validator( 版本v1.13.0 )的验证规则,这一篇重点讲述它的源码结构,及如何来对元素进行验证,错误消息提示的内部实现 一.插件结构(组织方式) 在讲 ...
- 【干货理解】理解javascript中实现MVC的原理
理解javascript中的MVC MVC模式是软件工程中一种软件架构模式,一般把软件模式分为三部分,模型(Model)+视图(View)+控制器(Controller); 模型:模型用于封装与应用程 ...
- 【AngularJS】—— 9 自定义过滤器
AngularJS另一个特点就是提供了过滤器,可以通过操作UNIX下管道的方式,操作数据结果. 通过使用管道,可以便于双向的数据绑定中视图的展现. 过滤器在处理过程中,将数据变成新的格式,而且可以使用 ...
- ngCordova插件安装使用
为什么ngCordova ngCordova是在Cordova Api基础上封装的一系列开源的AngularJs服务和扩展,让开发者可以方便的在HybridApp开发中调用设备能力,即可以在Angul ...
- 【AngularJS】—— 6基于AngularJS的过滤与排序
阅读目录 程序设计分析 代码以及结果 前面了解了AngularJS的使用方法,这里就简单的写个小程序,实现查询过滤以及排序的功能. 本程序中可以了解到: 1 angularjs的过滤器 2 n ...
- mysql 表锁问题
select * from information_schema.INNODB_lock_waits; select * from information_schema.INNODB_locks; S ...
- Swift2.1 语法指南——错误处理
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- gc是什么,什么时候需要gc
Java是由C++发展来的. 它摈弃了C++中一些繁琐容易出错的东西.其中有一条就是这个GC. 写C/C++程序,程序员定义了一个变量,就是在内存中开辟了一段相应的空间来存值.内存再大也是有限的,所以 ...