题意:

有一个网络中心,和许多个城市,网络中心以及城市之间有若干条边,这些边有两个属性,最大带宽和修建费用。

现在要用最多不超过C的费用修建网络,使得每个城市都有网络连接,最大化最小带宽。

带宽限制是,一条边可以接受不大于自己最大值的带宽。

边是有向边unidirectional

思路:

最大化最小值,那么考虑到用二分,但是这题应该有一个隐藏条件,那就是带宽越大,修建费用越高,这样才满足二分的条件。

然后有向边,就用最小树形图的朱刘算法,复杂度为O(n^3),由于n的规模比较小,所以可以接受。

注意,需要先特判输入中的最小带宽是否满足要求

代码:

 #include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std; const int N = ;
const int inf = 0x3f3f3f3f; int in[N],vis[N],pre[N],id[N]; struct edge
{
int from,to,cost; edge(int a,int b,int c)
{
from = a;
to = b;
cost = c;
}
}; struct node
{
int from,to,bd,cost; node(int a,int b,int c,int d)
{
from = a;
to = b;
bd = c;
cost = d;
}
}; vector<node> ns;
vector<edge> es; int n,m,sumc; int meet(int lim)
{
es.clear(); int root = ; int res = ; int tn = n; for (int i = ;i < m;i++)
{
int a = ns[i].from,b = ns[i].to,c = ns[i].bd,d = ns[i].cost; if (c < lim) continue; es.push_back(edge(a,b,d));
} while ()
{
//printf("2333\n"); memset(in,inf,sizeof(in)); for (int i = ;i < es.size();i++)
{
edge e = es[i]; int to = e.to; if (e.from != e.to && e.cost < in[to])
{
in[to] = e.cost;
pre[to] = e.from;
}
} for (int i = ;i < tn;i++)
{
if (i != root && in[i] == inf)
return -;
} int cnt = ; memset(id,-,sizeof(id));
memset(vis,-,sizeof(vis)); in[root] = ; for (int i = ;i < tn;i++)
{
res += in[i]; int v = i; while (vis[v] != i && id[v] == - && v != root)
{
vis[v] = i;
v = pre[v];
} if (id[v] == - && v != root)
{
for (int u = pre[v];u != v;u = pre[u])
{
id[u] = cnt;
} id[v] = cnt++;
}
} if (cnt == ) break; for (int i = ;i < tn;i++)
{
if (id[i] == -) id[i] = cnt++;
} for (int i = ;i < es.size();i++)
{
int to = es[i].to; es[i].from = id[es[i].from];
es[i].to = id[es[i].to]; if (es[i].from != es[i].to)
{
es[i].cost -= in[to];
}
} root = id[root];
tn = cnt;
} if (res > sumc) return -;
else return res;
} int main()
{
int t; scanf("%d",&t); while (t--)
{
scanf("%d%d%d",&n,&m,&sumc); ns.clear(); int mnb = inf,mxb = ; for (int i = ;i < m;i++)
{
int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); ns.push_back(node(a,b,c,d)); mxb = max(mxb,c);
mnb = min(mnb,c);
} if (meet(mnb) == -)
{
printf("streaming not possible.\n");
}
else
{
while (mxb - mnb > )
{
//printf("***\n");
int mid = (mxb + mnb) >> ; if (meet(mid) != -) mnb = mid;
else mxb = mid - ;
} while (meet(mnb+) != -) mnb++; printf("%d kbps\n",mnb);
}
} return ;
}

uvalive 11865 Stream My Contest的更多相关文章

  1. UVA 11865 Stream My Contest 组网 (朱刘算法,有向生成树,树形图)

    题意: 给n个点编号为0~n-1,0号点为根,给m条边(含自环,重边),每条边有个代价,也有带宽.给定c,问代价不超过c,树形图的最小带宽的最大值能达到多少? 思路: 点数才60,而带宽范围也不大,可 ...

  2. UVA 11865 Stream My Contest(最小树形图)

    题意:N台机器,M条有向边,总资金C,现要到搭建一个以0号机(服务器)为跟的网路,已知每条网线可以把数据从u传递到v,其带宽为d,花费为c,且d越大,传输速度越快,问能够搭建的传输速度最快的网络d值是 ...

  3. UVA 11865 Stream My Contest (二分+最小树形图)

    题意:给定一个网络,一个服务器,其他的是客户机,有 m 条连线,每条有一个带宽和花费(单向边),让你用不超过 c 的花费,使得 0 到 所有的机器都能到达,并且使得最小带宽最大. 析:很明显是二分题, ...

  4. 【UVA 11865】 Stream My Contest (二分+MDST最小树形图)

    [题意] 你需要花费不超过cost元来搭建一个比赛网络.网络中有n台机器,编号0~n-1,其中机器0为服务器,其他机器为客户机.一共有m条可以使用的网线,其中第i条网线的发送端是机器ui,接收端是机器 ...

  5. Stream My Contest UVA - 11865(带权最小树形图+二分最小值最大化)

    #include <iostream> #include <cstdio> #include <sstream> #include <cstring> ...

  6. UVA-11865 Stream My Contest (朱-刘 算法+二分)

    题目大意:有一张n个顶点,m条边的有向图,根节点为0.每条边有两个权值,一个是费用c,一个是长度b.问在总费用不超过cost的情况下选出若干条边,使得n个点连通时的边的最短长度的最大值是多少. 题目分 ...

  7. 题解 UVA11865 【Stream My Contest】

    最小树形图(朱刘算法)\(+\) 二分答案. 由题意得,我们要在一些有向边中选出一些边,使\(0\)号节点能够到达其他节点,使距离之和\(\leqslant cost\),并且使每条边中的带宽的最小值 ...

  8. 训练指南 UVA- 11865(有向最小生成树 + 朱刘算法 + 二分)

    layout: post title: 训练指南 UVA- 11865(有向最小生成树 + 朱刘算法 + 二分) author: "luowentaoaa" catalog: tr ...

  9. 2016 Asia Jakarta Regional Contest L - Tale of a Happy Man UVALive - 7722

    UVALive - 7722 一定要自己做出来!

随机推荐

  1. PopupMenu动态创建菜单

    1.TPopupMenu一条横线在Caption输入一个'-'就可以了.2.在Caption输入名字之后加入一个&就可以不显示快捷键,比如: 退出&  这样退出按钮的快捷键就不会显示出 ...

  2. java之旅_高级教程_java泛型

    摘自:http://www.runoob.com/java/java-generics.html JAVA泛型 java泛型(generics)是JDK5中引入的新特性,泛型提供了编译时类型安全检测机 ...

  3. 洛谷 P3684 机棚障碍Hangar Hurdles [CERC2016] 图论

    正解: 解题报告: 传送门! 首先不难想到这题主要有两个问题需要解决,一个是预处理出各个点的箱子半径最大值,一个是求ans 然后分别港下QwQ 首先关于预处理要说下昂 预处理有三种方法,分别港下 第一 ...

  4. String[]与List<String>的相互转换

    String[]转List String[] arr = new String[]{"a","b","c"}; List<String ...

  5. centos下搭建sockets5代理

    #安装依赖及ss5 yum -y install gcc openldap-devel pam-devel openssl-devel wget https://nchc.dl.sourceforge ...

  6. 003-pro ant design 前端权限处理-支持URL参数的页面

    前天需要增加MD5引用 https://www.bootcdn.cn/blueimp-md5/ 1.修改权限文件(CheckPermissions.js)使用自定义权限 2.配置异常页面 2.1.创建 ...

  7. PHP 测试杂项

    // 驼峰转下划线 function humpToUnderline($str){ if(empty($str)){ return ""; } $arr = str_split($ ...

  8. JavaScript 全栈工程师培训教程 - 阮一峰

    http://www.ruanyifeng.com/blog/2016/11/javascript.html https://github.com/ruanyf/jstraining 我现在的技术方向 ...

  9. SAP 从数据库中查询数据,带有where 条件。

    数据库表 代码 *& Report ZSELECT_DATA_FROM_ZMAST_CUST *&------------------------------------------- ...

  10. 关于时间的SQL语句

    取当前时间: select current_timestamp; 输出:2016-06-16 16:12:52 select now();  输出:2016-06-16 16:12:52 取当前时间的 ...