UVA-11865 Stream My Contest (朱-刘 算法+二分)
题目大意:有一张n个顶点,m条边的有向图,根节点为0。每条边有两个权值,一个是费用c,一个是长度b。问在总费用不超过cost的情况下选出若干条边,使得n个点连通时的边的最短长度的最大值是多少。
题目分析:如果已知这个最短距离的最大值d,则问题就变成了:用长度不小于d的边能否构成一个总权值不大于cost的最小树形图。因此,二分枚举d,用朱-刘 算法判断即可。
代码如下:
- # include<iostream>
- # include<cstdio>
- # include<vector>
- # include<cstring>
- # include<algorithm>
- using namespace std;
- # define REP(i,s,n) for(int i=s;i<n;++i)
- # define LL long long
- # define CL(a,b) memset(a,b,sizeof(a))
- const int INF=1<<30;
- struct Edge
- {
- int fr,to,w,d;
- };
- Edge e1[10005],e[10005];
- int n,m,cost,vis[65],ID[65],pre[65],in[65];
- int judge(int root,int nv,int ne)
- {
- int res=0;
- while(1){
- REP(i,0,nv) in[i]=INF;
- REP(i,0,ne) if(e[i].fr!=e[i].to&&in[e[i].to]>e[i].w){
- in[e[i].to]=e[i].w;
- pre[e[i].to]=e[i].fr;
- }
- in[root]=0;
- REP(i,0,nv) if(in[i]==INF) return -1;
- int nodeCnt=0;
- CL(ID,-1);
- CL(vis,-1);
- REP(i,0,nv){
- res+=in[i];
- int v=i;
- while(vis[v]!=i&&ID[v]==-1&&v!=root){
- vis[v]=i;
- v=pre[v];
- }
- if(v!=root&&ID[v]==-1){
- for(int u=pre[v];u!=v;u=pre[u])
- ID[u]=nodeCnt;
- ID[v]=nodeCnt++;
- }
- }
- if(nodeCnt==0) break;
- REP(i,0,nv) if(ID[i]==-1) ID[i]=nodeCnt++;
- REP(i,0,ne){
- int v=e[i].to;
- e[i].fr=ID[e[i].fr];
- e[i].to=ID[e[i].to];
- if(e[i].fr!=e[i].to)
- e[i].w-=in[v];
- }
- nv=nodeCnt;
- root=ID[root];
- }
- return res;
- }
- int main()
- {
- int T;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%d%d",&n,&m,&cost);
- int l=0,r=0;
- REP(i,0,m){
- scanf("%d%d%d%d",&e1[i].fr,&e1[i].to,&e1[i].d,&e1[i].w);
- r=max(r,e1[i].d);
- }
- int ans=-1;
- while(l<r){
- int mid=l+(r-l+1)/2,cnt=0;
- REP(i,0,m) if(e1[i].d>=mid) e[cnt++]=e1[i];
- int x=judge(0,n,cnt);
- if(x>0&&x<=cost){
- ans=l=mid;
- }else
- r=mid-1;
- }
- if(ans<0)
- printf("streaming not possible.\n");
- else
- printf("%d kbps\n",ans);
- }
- return 0;
- }
UVA-11865 Stream My Contest (朱-刘 算法+二分)的更多相关文章
- 训练指南 UVA- 11865(有向最小生成树 + 朱刘算法 + 二分)
layout: post title: 训练指南 UVA- 11865(有向最小生成树 + 朱刘算法 + 二分) author: "luowentaoaa" catalog: tr ...
- UVA 11865 Stream My Contest 组网 (朱刘算法,有向生成树,树形图)
题意: 给n个点编号为0~n-1,0号点为根,给m条边(含自环,重边),每条边有个代价,也有带宽.给定c,问代价不超过c,树形图的最小带宽的最大值能达到多少? 思路: 点数才60,而带宽范围也不大,可 ...
- uva11865 朱刘算法+二分
这题说的需要最多花费cost元来搭建一个比赛网络,网络中有n台机器,编号为0 - n-1其中机器0 为服务器,给了n条线有向的和他们的花费以及带宽 计算,使得n台连接在一起,最大化网络中的最小带宽, ...
- UVA 11865 Stream My Contest(最小树形图)
题意:N台机器,M条有向边,总资金C,现要到搭建一个以0号机(服务器)为跟的网路,已知每条网线可以把数据从u传递到v,其带宽为d,花费为c,且d越大,传输速度越快,问能够搭建的传输速度最快的网络d值是 ...
- UVA 11865 Stream My Contest (二分+最小树形图)
题意:给定一个网络,一个服务器,其他的是客户机,有 m 条连线,每条有一个带宽和花费(单向边),让你用不超过 c 的花费,使得 0 到 所有的机器都能到达,并且使得最小带宽最大. 析:很明显是二分题, ...
- hdu2121 - Ice_cream’s world II(朱刘算法,不固定根)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 题目意思大概是要你在一些城市中选一个做首都 , 要求首都都能到其他城市 , 道路花费要最少 , ...
- UVa11183 Teen Girl Squad, 最小树形图,朱刘算法
Teen Girl Squad Input: Standard Input Output: Standard Output You are part of a group of n teenage ...
- 最小树形图——朱刘算法(Edmonds)
定义:一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 朱刘算法实现过程: [在选出入边集后(看步骤1),若有向图中不存在有向环,说明该图就是最小树形图] 1,选入 ...
- uvalive 11865 Stream My Contest
题意: 有一个网络中心,和许多个城市,网络中心以及城市之间有若干条边,这些边有两个属性,最大带宽和修建费用. 现在要用最多不超过C的费用修建网络,使得每个城市都有网络连接,最大化最小带宽. 带宽限制是 ...
随机推荐
- vmware下安装centos7
下载vmware http://down-www.newasp.net/pcdown/big/wm_pro_14_win.rar 下载centos7 https://www.centos.org/do ...
- Mybatis中的#与$的区别
一.对比场景 场景:数据库分表时,需要将分表的表序号传入的sql中. SpringBoot中使用注解如下: @Insert("insert into collect_#{tblNum}(id ...
- 学会JS的this这一篇就够了
转自:http://www.imooc.com/article/1758 以前看某本书上讲: 掌握了JS中this的用法才算真正的跨过了JS的门槛 我深以为是!但是JS的this却并不是那么简单的内容 ...
- mysql5.7 linux安装参考
安装参考: https://www.cnblogs.com/ianduin/p/7679239.html http://blog.csdn.net/wb96a1007/article/details/ ...
- 130. Surrounded Regions(周围区域问题 广度优先)(代码未完成!!)
Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...
- ACM-ICPC 2018 沈阳赛区网络预赛 G. Spare Tire (容斥原理)
可推出$a_n = n^2+n, $ 设\(S_n = \sum_{i=1}^{n} a_i\) 则 \(S_n = \frac{n(n+1)(2n+1)}{6} + \frac{n(n+1)}{2} ...
- Unity状态机的实现,以《塔防》为例
什么是有限状态机? 通俗点讲,有限状态机是:将对象的状态(攻击.闲置.晕眩)的实现代码,提取出来,封装成状态.由状态机负责在各个状态之间调度. 对象持有状态管理类(状态机)的引用,与具体的状态解耦. ...
- 计算mysql 数据库 表大小 服务器传输 小写表明转成大写
//数据库表存储大小 select table_schema,table_name,table_rows,concat(round(data_length/1024/1024/1024,2),'GB' ...
- Git笔记之初识vi编辑器
1.vi编辑器 如同Windows下的记事本,vi编辑器是Linux下的标配,通过它我们可以创建.编辑文件.它是一个随系统一起安装的文本编辑软件. vi编辑器提供了3种模式,分别是命令模式.插入模式. ...
- C++ 单词接龙
问题描述: 拉姆刚刚开始学习英文字母,对单词排序很感兴趣,他能够迅速确定是否可以将这些单词排列在一个列表中,使得该列表中任何单词的首字母与前一个单词的尾字母相同,力能编写一个计算机程序帮助拉姆进行判断 ...