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 ...
随机推荐
- 二、oracle pctfree和pctused详解
一.建立表时候,注意PCTFREE参数的作用 PCTFREE:为一个块保留的空间百分比,表示数据块在什么情况下可以被insert,默认是10,表示当数据块的可用空间低于10%后,就不可以被insert ...
- 导入excel错误:外部表不是预期的格式 解决方案
环境:win7+iis7+Office2007 在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一 ...
- 什么时候使用tab键来对齐代码和代码的风格
在大括号嵌套语法中, 最好是左右(前后) 大括号单独占一行, 这样的嵌套关系最清晰 也就是说, c/c++的风格是最清晰的. 而java php将 左大括号放在上一行的末尾, 稍次一点. 不过在if ...
- shell 脚本样例
1 解压文件,移动文件,删除特定目录 #!/bin/bash pa=$(cd ``; pwd) //获得当前目录的绝对路径 v_dir=${pa} mkdir ${v_dir} dirDist=${ ...
- php开发中怎么获取服务端MAC地址?
MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址.硬件地址,用来定义网络设备的位置.在php中如何获取MAC(M ...
- [Kerberos] How to Kerberize an Hadoop Cluster
Overview Kerberos是一个第三方认证机制,用户和服务(known as principals)通过kerberos server (known as the Key Distributi ...
- Java并发包源码学习之AQS框架(二)CLH lock queue和自旋锁
上一篇文章提到AQS是基于CLH lock queue,那么什么是CLH lock queue,说复杂很复杂说简单也简单, 所谓大道至简: CLH lock queue其实就是一个FIFO的队列,队列 ...
- java项目报junit 相关错误
maven配置,java工程运行时需要把test测试相关移除
- Oracle添加数据报文字与格式字符串不匹配错误
今天在学习Oracle时碰到一个错:文字与格式字符串不匹配. 我在Oracle数据库中创建了一张表: --创建员工表employee create table employee ( empon ) n ...
- 怎样用路由器共享需要网页认证的wifi
设置步骤:第一步:登录管理界面 1.连接电脑使用单机能上网的电脑,通过网线连接到路由器的LAN口.2.登录管理界面打开电脑的浏览器,清空地址栏后,输入路由器的管理地址(以路由器底部标贴标识的管理地址为 ...