两道最小生成树范例,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))的更多相关文章

  1. ACM/ICPC 之 Prim范例(ZOJ1586-POJ1789(ZOJ2158))

    两道Prim解法范例题型,简单的裸Prim,且两题相较以边为重心的Kruskal解法而言更适合以点为重心扩展的Prim解法. ZOJ1586-QS Network 题意:见Code 题解:直接的MST ...

  2. ACM/ICPC 之 Floyd范例两道(POJ2570-POJ2263)

    两道以Floyd算法为解法的范例,第二题如果数据量较大,须采用其他解法 POJ2570-Fiber Network //经典的传递闭包问题,由于只有26个公司可以采用二进制存储 //Time:141M ...

  3. ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)

    两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory ...

  4. ACM/ICPC 之 BFS范例(ZOJ2913-ZOJ1136(POJ1465))

    通过几道经典BFS例题阐述BFS思路 ZOJ2913-Bus Pass 题意:找一个center区域,使得center到所有公交线路最短,有等距的center则输出id最小的. 题解:经典的BFS,由 ...

  5. ACM/ICPC 之 DFS范例(ZOJ2412-ZOJ1008)

    通过几道例题简单阐述一下DFS的相关题型 ZOJ2412-Farm Irrigation 直观的DFS题型,稍加变化,记录好四个方向上的通路就能够做出来 题目和接水管类似,问最少要灌溉几次,即求解最少 ...

  6. 2014嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛

    比赛链接: http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/36 题目来源: 2014嘉杰信息杯ACM ...

  7. ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))

    祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. 二、oracle pctfree和pctused详解

    一.建立表时候,注意PCTFREE参数的作用 PCTFREE:为一个块保留的空间百分比,表示数据块在什么情况下可以被insert,默认是10,表示当数据块的可用空间低于10%后,就不可以被insert ...

  2. 导入excel错误:外部表不是预期的格式 解决方案

    环境:win7+iis7+Office2007 在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一 ...

  3. 什么时候使用tab键来对齐代码和代码的风格

    在大括号嵌套语法中, 最好是左右(前后) 大括号单独占一行, 这样的嵌套关系最清晰 也就是说, c/c++的风格是最清晰的. 而java php将 左大括号放在上一行的末尾, 稍次一点. 不过在if ...

  4. shell 脚本样例

    1  解压文件,移动文件,删除特定目录 #!/bin/bash pa=$(cd ``; pwd) //获得当前目录的绝对路径 v_dir=${pa} mkdir ${v_dir} dirDist=${ ...

  5. php开发中怎么获取服务端MAC地址?

    MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址.硬件地址,用来定义网络设备的位置.在php中如何获取MAC(M ...

  6. [Kerberos] How to Kerberize an Hadoop Cluster

    Overview Kerberos是一个第三方认证机制,用户和服务(known as principals)通过kerberos server (known as the Key Distributi ...

  7. Java并发包源码学习之AQS框架(二)CLH lock queue和自旋锁

    上一篇文章提到AQS是基于CLH lock queue,那么什么是CLH lock queue,说复杂很复杂说简单也简单, 所谓大道至简: CLH lock queue其实就是一个FIFO的队列,队列 ...

  8. java项目报junit 相关错误

    maven配置,java工程运行时需要把test测试相关移除

  9. Oracle添加数据报文字与格式字符串不匹配错误

    今天在学习Oracle时碰到一个错:文字与格式字符串不匹配. 我在Oracle数据库中创建了一张表: --创建员工表employee create table employee ( empon ) n ...

  10. 怎样用路由器共享需要网页认证的wifi

    设置步骤:第一步:登录管理界面 1.连接电脑使用单机能上网的电脑,通过网线连接到路由器的LAN口.2.登录管理界面打开电脑的浏览器,清空地址栏后,输入路由器的管理地址(以路由器底部标贴标识的管理地址为 ...