描述:

  为了找寻沉睡的亚特兰提斯大陆,wm来到了大西洋上进行探险,找了半个月仍一无所获。然而在一次突袭而来的暴风雨后,wm的船莫名地驶入了一片未知的区域,发现了一个地图上未标记的岛屿,这让他感到相当惊讶,强烈的好奇心驱使他上岸看看究竟。
船在岛屿靠岸后岛上的国王举行庆典热情地款待了他,整个岛一片喜庆。国王自称是亚特兰提斯人,而这个岛屿曾经是亚特兰提斯大陆的最高地。现在岛屿上还有N个城市,由于岛上的资源相当有限且岛上没人知道怎么合理利用资源故一直以来在城市之间都没有铺设道路,现在国王想请wm规划下道路并进行建设,国王对规划的要求如下:
  1.所有城市必须连通,即任意两个城市都可以互相来往
  2.国王是个娇气的人,所以他希望从任意城市走到任意另一个城市时的“舒适度”越高越好,其中两个城市间的“舒适度”定义为:两个城市间路径的每一段道路的“舒适度”的最小者,例如从A到B需要经过C城市,A->C段“舒适度”为10,C->B段“舒适度”为100,则A->B的“舒适度”为10(当然如果两个城市间有很多路径的话国王会走“舒适度”最大的路径)。现在定义K为所有两个城市间“舒适度”的最小者,而国王希望K越大越好。
  现在岛上的资源只有R单位,国王希望wm帮他规划道路满足他的要求,在岛上资源条件的允许下输出最大的K。如果岛上的资源不够满足第1个要求,则输出-1。
wm沉迷于岛上的玩乐,懒得去想这问题了,所以他远程求助你,帮他解决这个烦人的问题。

输入:

  输入包含多组数据,EOF结束。
  每组数据以三个整数开头,N,M,R。N(2<=N<=1000)是城市数,M(0<=M<=100000)是允许建造的道路数,R(0<=R<=100000)是岛上仅有的资源数。EOF结束。
  接下来有M行数据,每行包括a,b(0<=a,b<N),v(0<v<=100000),c(0<=c<=100000)四个整数,表示ab城市间允许建一条双向道路,花费v单位资源,“舒适度”为c。

输出:

  每组数据输出一行,岛上资源条件的允许下最大的K或-1。

样例输入:

3 3 1000
0 1 20 8
1 2 10 7
2 0 10 6
3 3 20
0 1 20 8
1 2 10 7
2 0 10 6
2 1 10
0 1 20 8

样例输出:

7
6
-1

提示:

  第一组样例资源允许建设全部三条路(当然也可以只建0-1和1-2这两条道路),其中0-1之间的“舒适度”为8,1-2之间的“舒适度”为7,0-2之间的“舒适度”为7(可以从城市1中转,不直接走0-2这条“舒适度”为6的道路),故K值为min(8,7,7)=7,由于找不到更好的方案使K值更大,故输出7。

解题思路:

看到这个题的第一个想法是想先分析题意。

符号说明:

设需要建设的道路集为S。

对S中的每条道路road(k),其舒适度设为C(k),成本设为W(k)

目标:       Max(Min{C(k)})

约束:

1.S集中的道路需要能保证两两城市相通

2. sum(W(k))<=R,R是成本限制

如果目标是求总成本最小,那就是MST问题。但显然不是这样,之后我就想这和MST有什么关系呢?MST是满足约束1和2的解,目标就是设法使MST树中边的最小舒适度最大。所以我想到下面这个解法:

(1)对所有路按成本从小到大排序,生成最小生成树,得到树的最小舒适度C1

(2)如果无法生成MST或成本合大于R,输出 -1.结束

(3)去掉舒适度小于等于C1的所有路,再生成MST树,得到树的最小舒适度C2

(4)如果无法生成MST树或成本大于R,输出C1,结束。否则C1=C2, 转向(3)

实现算法后,程序一直不能AC,显示超时,所以又在网上找答案,一个更快的算法如下:

(1)对所路按成本从小到大排序

(2)以二分查找的方式从1~100000之间找满足条件1,2的最小生成树,找到的值就是所要的舒适度。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;struct Road{int start;int end;int cost;int comfor;
};vector<Road> roads;
vector<int> costOrd;
vector<int> parent;
vector<int>::iterator iter;
int N,M,R;
bool lessCost(const int &r1,const int &r2)
{return roads.at(r1).cost<roads.at(r2).cost;
}
int find_root(int x)
{while(x!=parent.at(x))x = parent.at(x);return x;
}
bool krusker(int curComfor)
{int sumCost = 0;parent.clear();for(int i=0;i<N;++i){parent.push_back(i);}int count = 0;for(iter=costOrd.begin();iter!=costOrd.end();++iter){if(roads.at(*iter).comfor<curComfor)continue;int p1 = find_root(roads.at(*iter).start);int p2 = find_root(roads.at(*iter).end);if(p1!=p2){sumCost += roads.at(*iter).cost;parent.at(p1) = p2;if(sumCost>R)return false;++count;if(count==N-1)return true;}}return false;
}
int main()
{while(cin>>N>>M>>R){roads.clear();costOrd.clear();for(int i=0;i<M;++i){Road path ;cin>>path.start>>path.end>>path.cost>>path.comfor;roads.push_back(path);costOrd.push_back(i);}sort(costOrd.begin(),costOrd.end(),lessCost);int left = -1;int right = 100001;int mid;while(left<right-1){mid = (left+right)/2;if(krusker(mid))left = mid;elseright = mid;}cout<<left<<endl;}return 0;
}

最后欢迎大家访问我的个人网站: 1024s

XDOJ1004 亚特兰提斯相关推荐

  1. 亚特兰提斯之帝国的遗址

    现今科学家探讨: 1.兰提斯可能就是克里特岛上延续到公元前一千四百年的迈诺斯文明.当时克里特帝国势力强大, 控制古代地中海一带.公元前一四七零年左右发生了一次火山大爆发, 专家想象过程是火山先喷出大量 ...

  2. 亚特兰提斯之人鱼宝宝

    人鱼宝宝:(以下故事为坊间较为流传的) 一艘苏联探测船在古巴外海执行核弹搜寻任务,却意外发现了一个 "人鱼宝宝" !! 随船的一位科学家维诺葛雷德博士,是苏联列宁科学院的的资深科学 ...

  3. 【图像】插值方法原理(最近邻,双线性,双三,兰索斯)

    插值流程分为以下几步: 1)计算放缩比例.比如原图是2x2,现在放大到3x3,那么放缩比例就是3/2. 2)计算现在图片上每个像素对应到原图哪个像素.比如(2, 2)的像素对应到原图就是(2/(3/2 ...

  4. 栈的亚特兰数与二叉树的前序中序遍历序列

    栈的亚特兰数与二叉树的前序中序遍历 @(算法学习) 已经熟知的是二叉树的中序遍历和先序遍历可以唯一确定一棵树. 更有趣的知识点是,以先序遍历序列作为入栈序列,那么出栈序列恰为中序遍历.这样就把两种遍历 ...

  5. 【JY】推开土木工程振型求解之兰索斯法(Lanczos法)的大门

    一.写在文前 [前言]子空间迭代法可同时求解几个极端特征值和相应的特征向量,但它有收敛较慢,运算量较大,积累误差的缺点:随后,人们对其作了进一步的研究,出现了预处理子空间迭代法,这种方法的运算量较之子 ...

  6. 基于兰彻斯特法则的通信运营商竞争形势研究

    [摘  要]随着通信基础业务发展空间的不断缩小,中国移动.中国电信和中国联通在移动业务和宽带业务上的竞争日益激烈,竞争格局与竞争战略成为了企业发展必不可少的研究重点.创新性地采用原用于军事分析的兰彻斯 ...

  7. 2016年度智能终端“墨提斯奖”(METIS)申报开始!

    各相关单位: 为落实工信部<智能硬件产业创新发展专项行动(2016-2018年)>,并展示智能终端领域最新成果.产业亮点.创新技术,移动智能终端技术创新与产业联盟和数据中心联盟计划评选20 ...

  8. 兰彻斯特平方定律 matlab,兰彻斯特模型

    数据代入(13)式,算出x(t)的理论值并与实际值作一比较. 对方程(13)用求和代替积分得 x t x a y f t t ()()()()=-+==∑∑01 1τττ τ (15) y t y b ...

  9. play home tifa_144Hz OLED屏手机 努比亚Play喜提Android 11_手机通讯

    10月28日消息, 努比亚宣布努比亚Play开启Android 11内测招募 . 在 努比亚社区 填写IMEI(移动通信国际识别码)等基本信息之后 获取内测资格 即可体验到最新的Android 11系 ...

最新文章

  1. 【redis】2.redis可视化工具安装使用
  2. hive sql操作
  3. GUI菜单——菜单条、菜单、子条目之间关系
  4. 使用IDEA在SpringBoot项目中连接数据库
  5. 详解如何进行第三方App接入微信登录
  6. php 逗号编码,php有几种编码
  7. astype函数_Python库收录——数值计算numpy库常用函数(含注释)
  8. 3_数据分析—数据清洗及特征处理
  9. 管程理解及用管程实现生产者消费者问题
  10. ashx获取input file 文件_通过Ajax方式上传文件(input file),使用FormData进行Ajax请求...
  11. 云计算基础技术及解决方案介绍
  12. 喜马拉雅 FM 已购付费音频下载
  13. Java 获取系统字体
  14. i7 8750h支持linux,开启游戏本六核时代!酷睿i7-8750H处理器性能实测
  15. 漂亮有创意的思维导图模板下载教程,教你思维导图怎么画
  16. 遭遇灰鸽子BackDoor.Gpigeon.ymg新变种
  17. 百度无线音乐盒刷打印服务器,百度无线音乐盒引关注 让普通音箱秒变Wi-Fi音箱...
  18. 【python】算术运算报错can‘t multiply sequence by non-int of type ‘float‘
  19. Windows 去除我的电脑页面多余的设备和驱动器图标
  20. 8086汇编(10、int9键盘中断)

热门文章

  1. 抖音接口安全参数X-Ladon、X-Argus计算过程分析
  2. USB设备,鼠标,键盘使用CH372,CH375,进行模拟的历程
  3. 奋斗吧,程序员——第十九章 无可奈何花落去,似曾相识燕归来
  4. 写给数据分析入门者:一种通用的数据分析思路
  5. 「LSTM 之父」亲笔万字长文,只为向世人证明:深度学习不是在母语为英语的地方被发明的
  6. 爬虫实战1:爬取豆瓣top250电影
  7. 「蓝湖设计协作平台」一切为了更好的交付
  8. python能参加奥赛吗-【家长必读】孩子学编程能参加哪些高含金量的比赛?
  9. 富爸爸,穷爸爸读后的一些认知
  10. linux实现对上传文件的定时备份、增量备份