G. 铁路修复计划 最小生成树
G. 铁路修复计划
二分答案,改变边的权值,找最小生成树即可。
类似的思想还可以用在单度限制最小生成树和最优比例生成树上。
#include<iostream>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
#include<stack>
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef long long int LL;
double k;
int n,m;double M;
struct edge
{
int from;int to;
LL cost;int foreign;
bool operator <(const edge &b)const
{
return (cost+foreign*(k-1.)*cost)<(b.cost+b.foreign*(k-1.)*b.cost);
}
};
const int maxn=100000+5;
edge e[maxn];
int belong[maxn];
int be(int x)
{
if(x==belong[x])return x;
else return belong[x]=be(belong[x]);
}
bool ex(double mid)
{
k=mid;
sort(e,e+m);
for(int i=1;i<=n;i++)belong[i]=i;
double ansnow=0;
for(int i=0;i<m&&ansnow<=M;i++)
{ int u=e[i].from,v=e[i].to;
u=be(u);v=be(v);
//cout<<"ll"<<u<<v<<endl;
if(u!=v){ansnow+=(e[i].cost+e[i].foreign*(k-1.)*e[i].cost),belong[v]=u;}
//cout<<ansnow<<endl;
}
return ansnow<=M;
}
int main()
{
// freopen("t.txt","r",stdin);
LL MM;
scanf("%d%d%lld",&n,&m,&MM);
M=(double)MM;
//cout<<M<<endl;
for(int i=0;i<m;i++)
scanf("%d%d%d%d",&e[i].from,&e[i].to,&e[i].cost,&e[i].foreign);
double l=1.0,r=1e+15;
while((r-l)>1e-8)
{
//cout<<"double"<<l<<" "<<r<<endl;
double mid=(r+l)/2.;
if(ex(mid))l=mid;
else r=mid;
}
printf("%.6lf",(l+r)/2.);
return 0;
}
G. 铁路修复计划 最小生成树的更多相关文章
- ECNU 3247 - 铁路修复计划
Time limit per test: 2.0 seconds Time limit all tests: 15.0 seconds Memory limit: 256 megabytes 在 A ...
- EOJ 3247 铁路修复计划
二分,最小生成树. 二分一下$k$,然后每次算最小生成树验证即可,事实证明,$cmp$函数,参数用引用还是能提高效率的,不引用一直$TLE$,时限有点卡常. 然后错误的代码好像$AC$了啊,$L$和$ ...
- EOJ3247:铁路修复计划
传送门 题意 分析 这题用二分做就好啦,有点卡常数,改了几下for的次数 套了个板子,连最小生成树都忘记了QAQ trick 代码 #include<cstdio> #include< ...
- Atcoder CODE FESTIVAL 2016 Final G - Zigzag MST[最小生成树]
题意:$n$个点,$q$次建边,每次建边选定$x,y$,权值$c$,然后接着$(y,x+1,c+1),(x+1,y+1,c+2),(y+1,x+2,c+3),(x+2,y+2,c+4)\dots$(画 ...
- POJ2485 最小生成树
问题:POJ2485 本题求解生成树最大边的最小值 分析: 首先证明生成树最大边的最小值即最小生成树的最大边. 假设:生成树最大边的最小值比最小生成树的最大边更小. 不妨设C为G的一个最小生成树,e是 ...
- 《算法导论》学习总结 — XX.第23章 最小生成树
一.什么叫最小生成树 一个无向连通图G=(V,E),最小生成树就是联结所有顶点的边的权值和最小时的子图T,此时T无回路且连接所有的顶点,所以它必须是棵树. 二.为什么要研究最小生成树问题 <算法 ...
- 图->连通性->最小生成树(普里姆算法)
文字描述 用连通网来表示n个城市及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价.对于n个定点的连通网可以建立许多不同的生成树,每一棵生成树都可 ...
- (原创)最小生成树之Prim(普里姆)算法+代码详解,最懂你的讲解
Prim算法 (哈欠)在创建最小生成树之前,让我们回忆一下什么是最小生成树.最小生成树即在一个待权值的图(即网结构)中用一个七拐八绕的折线串连起所有的点,最小嘛,顾名思义,要权值相加起来最小,你当然可 ...
- 最小生成树的Prim算法
构造最小生成树的Prim算法 假设G=(V,E)为一连通网,其中V为网中所有顶点的集合,E为网中所有带权边的集合.设置两个新的集合U和T,其中集合U用于存放G的最小生成树的顶点,集合T用于 ...
随机推荐
- hdu 2377 Bus Pass
Bus Pass Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- Final Battle #1 K题 Fire game
Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows ...
- UVA 140 Bandwidth (dfs 剪枝 映射)
题意: 给定一个n个结点的图G和一个结点的排列, 定义结点i的带宽b(i)为i和相邻结点在排列中的最远距离, 所有b(i)的最大值就是这个图的带宽, 给定G, 求让带宽最小的结点排列. 给定的图 n ...
- Discuz论坛广告横幅大图在百度app内无法显示,百度app默认开启了广告屏蔽
问题由来 前段时间搭的一个Discuz论坛上挂了2个广告横幅,网站的话收录还不错,然后客户就反应百度app上无法看到横幅. 由于我没有下载百度app,看不到效果我将信将疑,因为电脑,手机浏览器都是ok ...
- Lucene实现全文检索的流程
[索引和搜索流程图] 对要索引的原始内容进行索引构建一个索引库,索引过程包括:确定原始内容即要搜索的内容->采集文档->创建文档->分析文档->索引文档. 从索引库中搜索内容, ...
- 本地==〉Github(push)
[概述] Git中的项目是本地的,为了可以协同工作.需要将项目推送到GitHub服务器上. [步骤] 1) 第一步:创建项目 2) 第二步:在github上创建一个同名的空项目 ①选择Your rep ...
- linux-NMON监控
- java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.views.login_jsp
背景:SpringBoot的项目配置了对jsp的支持,走控制器就报这个错误.相关配置如下: <!-- JSP BEGIN --> <dependency> <groupI ...
- 选择判断语句(switch)
选择判断语句(switch) 一.switch语句格式 switch(表达式){ case 取值1: 执行语句: break: case 取值2: 执行语句: break: …... defau ...
- MongoDB小结10 - update【upsert】
upsert是一个选项,它是update的第三个参数,并不是一个方法.它是一种特殊的更新,要是没有文档符合匹配,那么它就会根据条件和更新文档为基础,创建新的文档,如有匹配,则正常更新.咱们之前见到的所 ...