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用于 ...
随机推荐
- Tensor数据类型
目录 Tensor数据类型 属性 数据类型判断 数据类型转换 tensor转numpy Tensor数据类型 list: [1,1.2,'hello'] ,存储图片占用内存非常大 np.array, ...
- python第一章计算机基础
第一章 计算机基础 1.1 硬件 计算机基本的硬件由:CPU / 内存 / 主板 / 硬盘 / 网卡 / 显卡 / 显示器 等组成,只有硬件但硬件之间无法进行交流和通信. 1.2 操作系统 操作系统用 ...
- 洛谷 3106 [USACO14OPEN]GPS的决斗Dueling GPS's 3720 [AHOI2017初中组]guide
[题解] 这两道题是完全一样的. 思路其实很简单,对于两种边权分别建反向图跑dijkstra. 如果某条边在某一种边权的图中不是最短路上的边,就把它的cnt加上1.(这样每条边的cnt是0或1或2,代 ...
- java读utf8 的txt文件,第一个字符为空或问号问题
参考:https://blog.csdn.net/yangzhichao888/article/details/79529756 https://blog.csdn.net/wangzhi291/ar ...
- hdu 2642二维树状数组 单点更新区间查询 模板题
二维树状数组 单点更新区间查询 模板 从零开始借鉴http://www.2cto.com/kf/201307/227488.html #include<stdio.h> #include& ...
- MySQL查看表结构及查看建表语句
查看表结构:desc 表名 mysql> use recommend; Database changed mysql> desc user; +--------------+------- ...
- segv & mini coredump 调研
1. mini coredump a. segv http://zh.scribd.com/doc/3726406/Crash-N-Burn-Writing-Linux-applica ...
- 打造Spring Cloud构建微服务架构的最全资料
访问: https://git.oschina.net/didispace/SpringCloud-Learning http://blog.didispace.com/categories/Spri ...
- Thread.run方法是同步方法
Thread.run方法是同步方法, 线程: package com.stono.thread.page005; public class MyThread extends Thread { @Ove ...
- 编程算法 - n个骰子的点数(递归) 代码(C)
n个骰子的点数(递归) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 把n个骰子仍在地上, 全部骰子朝上一面的点数之和为s. 输入n, 打印出 ...