两道最小生成树范例,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. jquery 选择器 -高级使用 新的 心得

    jQuery的each函数: each函数等同于c语言中的for函数: 里面每次循环的 "context 上下文" == 当前的dom ,可以使用this, 也可以使用$(this ...

  2. .net利用NPOI导入导出Excel

    NPOI在.net中的操作Excel 1.读取 using (FileStream stream = new FileStream(@"c:\客户资料.xls", FileMode ...

  3. [译]Node.js Best Practices

    原文: http://blog.risingstack.com/node-js-best-practices/ 下面的的最佳实践分为代码风格和开发工作流两种. 代码风格 Callback约定 Modu ...

  4. git/gitLab

    gitlab安装:http://www.360doc.com/content/15/0603/14/21631240_475362133.shtml http://www.cnblogs.com/wi ...

  5. 微信 6.5.1 for iOS发布 可以在朋友圈分享相册中的视频

    今天微信 6.5.1 for iOS发布了,最主要的一个功能是可以在朋友圈分享相册中的视频,卖转发朋友圈视频软件的家伙估计要哭了.微信这次更新,更有利于个人号的运营,个人号的价值将更高.先定一个小目标 ...

  6. hihoCoder挑战赛11.题目4 : 高等理论计算机科学(LCA)

    clj在某场hihoCoder比赛中的一道题,表示clj的数学题实在6,这道图论貌似还算可以... 题目链接:http://hihocoder.com/problemset/problem/1167 ...

  7. EL表达式和JSTL

    EL相关概念JSTL一般要配合EL表达式一起使用,来实现在jsp中不出现java代码段.所以我们先来学习EL表达式 EL主要用于查找作用域中的数据,然后对它们执行简单操作:它不是编程语言,甚至不是脚本 ...

  8. 解决vs2010“创建或打开C++浏览数据库文件 发生错误”的问题 Microsoft SQL Server Compact 3.5

    有网友说打开vs2010安装光盘,搜索 SSCERuntime_x86-chs.msi,重新安装之.于是果断搜索,发现SSCERuntime_x86-chs.msi,另外发现一个SSCEVSTools ...

  9. 元素间距属性(scrollLeft,scrollWidth,clientWidth,offsetWidth,padding,margin)

    scrollHeight: 获取对象的滚动高度.scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端 ...

  10. gulp常用插件

    本人就职于一家互联网小公司,根据自己的项目纪录一下常用的gulp插件,项目不是很大! 文章目录 1. gulp-load-plugins 2. yargs 3. del 4. gulp-filter ...