问题描述:
赤壁之战前夕,庞统向周瑜献连环计,瑜设计使蒋干邀庞统到曹营。操与统同观营寨,又共论兵法。统对答如流使操敬服。统乘机提出:大江中风浪不息使北兵易生疾病。可将大
小船配搭,首尾用铁环连锁,铺阔板以便人马行走。操闻之大喜,派人连夜打造连环大钉,锁住船只。
每打造一单位长度的铁索要花费一单位的钱,曹操希望用最少的花费将 n 艘战船连接起来(任意两艘战船直接或间接被铁索连接),每艘战船可以看成一个点,坐标为(xi,yi),曹营中有一位神秘人物,他所在的战船必须和曹操所在战船直接连接,求最小花费。
数据输入:
第一行战船数 n(2<=n<=100)。

第二行神秘人物所在的战船序号 a,曹操所在战船序号 b,(1<=a,b<=n,a!=b),战船序号从 1 到 n。

接下来 n 行,每行两个实数(建议定义成 double 类型):xi,yi(-1000<=xi,yi<=1000),表
示序号为 i 的战船的坐标。
结果输出:
连接 n 艘战船的最小花费,输出答案的时候四舍五入保留两位小数。

输入示例:

4
2 3
0 0
1 0
0 -1
1 -1

输出示例:

3.14

MST最小生成树的变形。。敢不敢不要那么明显。。。

要求某辆船和曹操的船相连接,MST多一步就可以了(卖个关子,很明显的)

-----------------2013/12/17上传-----------------

prim

#include<cstdio>
#include<cmath>
const int MAXN=101;
const int INF=9999999;
double map[MAXN][MAXN];
double dis[MAXN];
struct point
{double x,y;
}ship[MAXN];void prim(int a,int b,int n)
{int i,j;for(i=1;i<=n;i++)dis[i]=INF;bool vis[MAXN]={0};int cur=a;            vis[a]=1;dis[a]=0;for(i=1;i<=n;i++)     //prim算法的做法是先从a开始扩散,更新与a连接的所有船。{                        //只不过把下一步找出最小的边改为直接从b开始if(!vis[i] )      dis[i]=map[cur][i];     }    cur=b;vis[b]=1;for(i=1;i<=n;i++){double mini=INF;for(j=1;j<=n;j++)if(!vis[j] && dis[j] > map[cur][j])dis[j]=map[cur][j];for(j=1;j<=n;j++)if(!vis[j] && mini > dis[j])mini=dis[cur=j];vis[cur]=true;}
}
int main()
{int n,a,b;scanf("%d",&n);scanf("%d%d",&a,&b);int i,j;for(i=1;i<=n;i++)scanf("%lf%lf",&ship[i].x,&ship[i].y);for(i=1;i<=n;i++){for(j=1;j<=n;j++){map[i][j]= map[j][i] = sqrt((ship[j].y -ship[i].y) *(ship[j].y -ship[i].y) + (ship[j].x -ship[i].x)*(ship[j].x -ship[i].x));}}prim(a,b,n);double ans=0;for(i=1;i<=n;i++)ans+=dis[i];printf("%.2lf\n",ans);return 0;
}

kruskal

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=102;
const int INF=9999999;
int fa[MAXN];struct point
{double x,y;
}ship[MAXN];struct dot
{int x,y;double dis;
}dis[MAXN*MAXN];int find(int cur)
{return fa[cur]==cur?cur:fa[cur]=find(fa[cur]);
}bool operator < (const dot &a,const dot& b)
{return a.dis<b.dis;
}int main()
{int n;scanf("%d",&n);int a,b;scanf("%d%d",&a,&b);int i,j;for(i=1;i<=n;i++)scanf("%lf%lf",&ship[i].x,&ship[i].y);double ans;int len=0;for(i=1;i<=n;i++){for(j=i+1;j<=n;j++){dis[len].x=i;dis[len].y=j;dis[len].dis=sqrt((ship[j].y -ship[i].y) *(ship[j].y -ship[i].y) + (ship[j].x -ship[i].x)*(ship[j].x -ship[i].x));if(i==a && j==b || i==b && j==a)ans=dis[len].dis;len++;}}for(i=1;i<=n;i++)   fa[i]=i;sort(dis,dis+len);fa[b]=a;         //kruakal 做法更简单,直接一开始把a和b设为一个集合就可以了//然后把答案加上a到b边的值就可以了。for(i=0;i<len;i++)   {int rootx=find(dis[i].x);int rooty=find(dis[i].y);if(rootx!=rooty){ans+=dis[i].dis;fa[rootx]=rooty;}}printf("%.2lf\n",ans);return 0;
}

数据结构与算法实验题 7.2 连环计相关推荐

  1. 数据结构与算法实验题7.2 连环计

    问题描述: 赤壁之战前夕,庞统向周瑜献连环计,瑜设计使蒋干邀庞统到曹营.操与统同观营寨, 又共论兵法.统对答如流使操敬服.统乘机提出:大江中风浪不息使北兵易生疾病.可将大 小船配搭,首尾用铁环连锁,铺 ...

  2. 数据结构与算法实验题 4.2 Who is the strongest

    数据结构与算法实验题 4.2 Who is the strongest ★实验任务 在神奇的魔法世界,召唤师召唤了一群的魁偶.这些魁偶排成一排,每个魁偶都有一个 战斗值.现在该召唤师有一个技能,该技能 ...

  3. 数据结构与算法实验题 6.1 鼹鼠掘土挑战赛

    数据结构与算法实验题 6..1 鼹鼠掘土挑战赛 ★实验任务 在潘多拉星的哈利路亚山上,生活着许多鼹鼠矿工,它们同属于潘多拉矿业公司哈利路 亚分公司.尽管在潘多拉星最美丽壮阔的地方工作,是一件十分让普通 ...

  4. 数据结构与算法实验题 10.1 神谕者

    ★实验任务  众所周知,dota 中神谕者的大招可以抵挡所有伤害,但是当大招结束时会一次性结算所有伤害.神谕者在大招期间已经遭受了 n 次伤害,他现在希望知道自己所遭受伤害中的第 k 小伤害值,但是他 ...

  5. 数据结构与算法实验题 9.8 转移炸弹

    ★实验任务 A国有 N个城市,这些城市编号为 1到 N,有一天,他们调查出恐怖分子在每个城市中都安放了炸弹,于是他们给炸弹也编上了序号,第 i 个城市里的炸弹编号为 i.现在他们想把这些炸弹转移,以便 ...

  6. c语言编写队列元素逆置,数据结构与算法实验—利用栈逆置队列元素.doc

    数据结构与算法实验-利用栈逆置队列元素 利用栈逆置队列元素实验报告 通信1204班 谢崇赟 实验名称 利用堆栈将队列中的元素逆置 实验目的 会定义顺序栈和链栈的结点类型. 掌握栈的插入和删除结点在操作 ...

  7. Ants (POJNo.1852)--数据结构与算法刷题记录

    数据结构与算法刷题记录1 时间:4.28 这是第一次用CSDN来记录自己的学习成果,在此留下纪念,希望自己能够坚持下去,变得更强. 本次学习记录来源于<挑战程序设计竞赛(第2版)> Ant ...

  8. 一夜登顶GitHub!字节内网数据结构与算法刷题笔记,看完直呼卧槽

    网络上流传着一句段子"程序员两条腿,一条是算法,一条是英文,想跑的更远,这两条腿都不能弱".英文,我们暂且不谈,我们先来谈谈算法. 算法之难,在于将精巧的逻辑,通过合适的数据结构, ...

  9. 面试题库 之 数据结构与算法 100题

    1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. 要求不能创建任何新的结点,只调整指针的指向. 10 / \ 6 14 / \ / \ 4 8 ...

最新文章

  1. ubuntu-make/makefile/cmake
  2. 【 Vivado 】时钟类型
  3. opencv第三方库JAVA接口,SpringBoot使用OpenCV示例总结
  4. Linux Shell基础 - 流程控制 - for循环 - while 循环 - until循环
  5. JDBC笔记-李伟杰版
  6. java 重定向关键字_SpringMVC 转发、重定向
  7. 2.4_double-ended_queue_双向队列
  8. 用lstm模型做预测_使用LSTM深度学习模型进行温度的时间序列单步和多步预测
  9. 免费收录网站搜索引擎登录口大全
  10. html动态图片怎么设背景,[gif制作教程]如何把gif动态图片的背景变透明,仍保留有动画效果...
  11. java -verbose命令
  12. mysql salve从库设置read only 属性
  13. tiup telemetry
  14. AutoJs学习-截屏器
  15. 颓废了很久了,需要振作了
  16. intellij idea 工具栏的隐藏和显示
  17. 图像修复实例解析(二)
  18. 戴维·萨尔诺夫,霍华德·阿姆斯特朗以及超外差无线接收机
  19. 2010年搜索引擎的发展状况
  20. python删除空值的行_python如何删除列为空的行

热门文章

  1. 说说一个人怎样开发小程序的
  2. MFC中主副屏窗口全屏最大化的几种方法
  3. HBase数据压缩方式的介绍与实战
  4. html横向自动换行,HTML自动换行的问题
  5. BP神经网络算法基本原理,bp神经网络简单实例
  6. Java学习——门票计费程序
  7. 5G驱动光缆市场发展,MPO光缆将成需求热门
  8. linux 查看文件 文件夹大小
  9. win10安装centos7、安装显卡驱动和cuda、安装mpich全流程
  10. 参加阿里云栖大会Tech Insight,不可错过的6大理由