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 ...
随机推荐
- JQuery-EasyUI与EXTjs有什么区别?
一.ExtJS1.ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javascript写的,主要用于创建前端用户界面,是一个与后台技术无关的前端ajax框架.因此,可以把ExtJS用在 ...
- data and dream
1 用通俗的语言介绍下线性回归->逻辑回归->SVM之间的区别和联系. 2 聚类算法的应用场景,以及k-means中的k值怎么确定. def center(data): center = ...
- oracle中的number类型
number 数据类型 number (precision,scale) a) precision表示数字中的有效位,如果没有指定precision的话,oracle将使用38作为精度: b) ...
- java练手 韩信点兵
Problem C 韩信点兵 时间限制:3000 ms | 内存限制:65535 KB 描述 相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队 ...
- 6.3.28微信需群主确认才可进群&发GIF动图功能内测开始了
昨天下午有网友收到微信6.3.28新版内测邀请,不过这个内部体验目前貌似只对安卓手机开放,苹果的IOS系统还不支持,会提示“你当前使用的是非安卓设备,不建议下载安卓体验包,但你仍可邀请朋友尝鲜”.最新 ...
- hadoop之 flume1.6安装
flume 1.6安装1.解压 2.复制 cp conf/flume-conf.properties.template conf/flume.conf cp conf/flume-env.sh.tem ...
- 错误:The Controls collection cannot be modified because the control contains code blocks (i.e. ). .
用 <%# %>这种写法是写在数据绑定控件中的,之所以用 <%= %>会出现The Controls collection cannot be modified because ...
- Objective-C上地球坐标系到火星坐标系转换算法
Objective-C上地球坐标系到火星坐标系转换算法 http://blog.csdn.net/zhaoxy_thu/article/details/17033347
- thinkphp中的自动验证
array(验证字段,验证规则,错误提示,[验证条件,附加规则,验证时间]) 1.验证字段 需要验证的表单字段名称,这个字段不一定是数据库字段,也可以是表单的一些辅助字段,例如确认密码和验证码等等.有 ...
- 【转】 GridView 72般绝技
说明:准备出一个系列,所谓精髓讲C#语言要点.这个系列没有先后顺序,不过尽量做到精.可能会不断增删整理,本系列最原始出处是csdn博客,谢谢关注. C#精髓 第四讲 GridView 72般绝技 作者 ...