UVa11865 Stream My Contest

UVa11865 Stream My Contest

  • 题目链接
  • 题意
    • 输入格式
    • 输出格式
  • 分析
    • 朱-刘算法
  • 不固定根的最小树形图求法
  • AC 代码

题目链接

   UVA - 11865 Stream My Contest

题意

   你需要花费不超过cost元来搭建一个比赛网络。网络中有n台机器,编号为0~n-1,其中机器0为服务器,其他机器为客户机。一共有m条可以使用的网线,其中第i条网线的发送端是机器 u i u_i ui,接受端是机器 v i v_i vi(数据只能从机器 u i u_i ui单向传输到机器 v i v_i vi),带宽是 b i b_i bi Kbps,费用是 c i c_i ci元。每台客户机应当恰好从一台机器接受数据(即恰好有一条网线的接收端是该机器),而服务器不应从任何机器接收数据。你的任务是最大化网络中的最小带宽。

输入格式

   输入第一行为数据组数T(T≤50)。每组数据第一行为3个整数n, m, cost(1≤n≤60,1≤m≤10 000,1≤cost≤ 1 0 9 10^9 109)。以下m 行每行用4 个整数u, v, b, c(0≤u,v<n,1≤b,c≤ 1 0 6 10^6 106,u!=v)描述一条网线。

输出格式

   对于每组数据,输出最小带宽的最大值。如果无法搭建网络,输出“streaming not possible.”(不含引号)。

分析

   二分答案(最小带宽),找出从0出发的最小树形图(需要禁用带宽小于答案的网线),判断权值和是否超过cost即可。
   固定根的最小树形图可以用朱-刘算法(也称 Edmonds 算法)解决,其时间复杂度为 O ( V E ) O(VE) O(VE),此算法不能找出最小树形图的各条边,只能求出其权值和。
   Tarjan提出了一种能够在 O ( E + V l o g V ) O(E+VlogV) O(E+VlogV)时间内解决最小树形图问题的算法,不过其内部实现比较复杂。

朱-刘算法

  1. 初始化权值和 a n s = 0 ans=0 ans=0
  2. 给所有非根结点 v i v_i vi选择一条权最小的入边(自环边除外), p r e [ v i ] pre[v_i] pre[vi]记录其起点, w [ v i ] w[v_i] w[vi]记录其最小边权。如果有孤立结点(无入边),说明最小树形图不存在,算法终止。
  3. 对每个结点 v i v_i vi,将其边权累加入答案 a n s = a n s + w [ v i ] ans=ans+w[v_i] ans=ans+w[vi]
  4. 检查选定的这些入边是否形成了环,有则执行步骤4,否则说明已经求出了最小树形图的权值和,结束。
  5. 将每个环缩成一个点 k i k_i ki并对环内的点重新编号 i d [ v i ] = k i id[v_i]=k_i id[vi]=ki,为了便于统一处理,可以对不构成环的那些点也像这样重新编号,从而使得新的编号连续。更新根节点编号、结点数量并对每条有向边 ( u i , v i , w i ) (u_i,v_i,w_i) (ui,vi,wi)做更新 w i = w i − w [ v i ] ; u i = i d [ u i ] ; v i = i d [ v i ] w_i=w_i-w[v_i];\space u_i=id[ui];\space v_i=id[v_i] wi=wiw[vi]; ui=id[ui]; vi=id[vi]然后回到步骤1。

   朱-刘算法核心思想就是缩圈(对结点重新编号)并修改边权,有些版本的实现有一个DFS/BFS预处理:判断根结点是否可以到达其他所有结点。这里给出的实现版本不做预处理,而是在反复缩圈的过程中检查是否有孤立点(有孤立点说明根结点无法到达部分结点)。

不固定根的最小树形图求法

   新加一个点作为根,和原图每个点连一条边权相同的有向边,这个权值大于原图所有边权的最大值,求出固定根最小树形图,也就求出了原图不固定根的最小树形图。

AC 代码

#include <iostream>
#include <cstring>
using namespace std;#define M 10010
#define N 63
int g[N][M], s[N], q[N], f[N], w[N], id[N], vis[N], m, n, c;
struct edge {int u, v, b, c;} e0[M], e[M];bool check(int x) {memcpy(e, e0, sizeof(e));for (int i=0; i<n; ++i) f[i] = 0;int head = 0, tail = 1; f[q[0] = 0] = 1;while (head < tail) {int u = q[head++];for (int i=0; i<s[u]; ++i) {const edge &eg = e[g[u][i]];if (eg.b < x) continue;if (!f[eg.v]) {q[tail] = eg.v; f[eg.v] = 1;if (++tail == n) break;}}if (tail == n) break;}if (tail < n) return false;int ans = 0, r = 0, k = n;while (true) {for (int i=0; i<k; ++i) f[i] = i;for (int i=0; i<m; ++i) if (e[i].b >= x && e[i].u != e[i].v) {int u = e[i].u, v = e[i].v;if (f[v] == v || e[i].c < w[v]) f[v] = u, w[v] = e[i].c;}int t = w[r] = 0;for (int i=0; i<k; ++i) id[i] = vis[i] = -1;for (int i=0, v; i<k; ++i) {ans += w[i];for (v = i; vis[v] != i && id[v] < 0 && v != r; v = f[v]) vis[v] = i;if (id[v] < 0 && v != r) {for (int u = f[v]; u != v; u = f[u]) id[u] = t;id[v] = t++;}}if (t == 0) break;for (int i=0; i<k; ++i) if (id[i] < 0) id[i] = t++;for (int i=0; i<m; ++i) if (e[i].b >= x) {int u = e[i].u, v = e[i].v;e[i].u = id[u]; e[i].v = id[v]; e[i].c -= w[v];}k = t; r = id[r];}return ans <= c;
}void solve() {cin >> n >> m >> c;for (int i=0; i<n; ++i) s[i] = 0;int l = 2000000, r = 0;for (int i=0; i<m; ++i) {cin >> e0[i].u >> e0[i].v >> e0[i].b >> e0[i].c;l = min(l, e0[i].b); r = max(r, e0[i].b); g[e0[i].u][s[e0[i].u]++] = i;}if (!check(l)) {cout << "streaming not possible." << endl;return;}while (l < r) {int m = (l+r+1)>>1;check(m) ? l = m : r = m-1;}cout << l << " kbps" << endl;
}int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int t; cin >> t;while (t--) solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/9292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洗地机什么品牌好?洗地机怎么选?618洗地机选购指南

随着科技的飞速发展&#xff0c;洗地机以其高效的清洁能力、稳定的性能和用户友好的设计而闻名&#xff0c;不仅可以高效吸尘、拖地&#xff0c;还不用手动洗滚布&#xff0c;已经逐渐成为现代家庭不可或缺的清洁助手。然而&#xff0c;在众多品牌和型号中&#xff0c;如何选择…

C++语言·string类

1. 为什么有string类 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数(strcpy,strcat)&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP(Object Oriented Programming面向对…

封装长按触发事件的uniapp组件

简单说一下原理 首先介绍三个针对触摸屏设备的事件&#xff0c;分别是&#xff1a; touchstart&#xff1a;当手指触摸屏幕时触发&#xff0c;即触摸开始的时候&#xff1b;touchend&#xff1a;当手指离开屏幕时触发&#xff0c;即触摸结束的时候&#xff1b;touchcancel&am…

【深耕 Python】Quantum Computing 量子计算机(3)重要数学公式一览

写在前面 往期量子计算机博客&#xff1a; 【深耕 Python】Quantum Computing 量子计算机&#xff08;1&#xff09;图像绘制基础 【深耕 Python】Quantum Computing 量子计算机&#xff08;2&#xff09;绘制电子运动平面波 正文 偏微分&#xff1a; 交换关系&#xff…

GtkButton事件处理、事件的捕获、鼠标事件等

事件 事件处理 GTK 所提供的工具库与其应用程序都是基于事件触发机制来管理&#xff0c; 所有的应用程序都是基于事件驱动。 如果没有事件发生&#xff0c; 应用程序将处于等待状态&#xff0c; 不会执行任何操作&#xff0c; 一旦事件发生&#xff0c; 将根据不同的事件做出…

Offer必备算法37_记忆化搜索_五道力扣题详解(由易到难)

目录 记忆化搜索概念和使用场景 ①力扣509. 斐波那契数 解析代码1_循环 解析代码2_暴搜递归 解析代码3_记忆化搜索 解析代码4_动态规划 ②力扣62. 不同路径 解析代码1_暴搜递归&#xff08;超时&#xff09; 解析代码2_记忆化搜索 解析代码3_动态规划 ③力扣300. 最…

Java12基础(Package包 作用域 String字符串)

目录 一. Package包 import关键字 命名规范 二. 作用域 三. String字符串(进阶) 创建方式: 内存情况: 1. 字符串的搜索 2. trim()方法 3. 替换字符串 4. 分割字符串 5. 拼接字符串 6. 格式化字符串 7. 类型转换 8. 转换为char[ ]字符数组 9. 字符编码 10. Str…

Navicat导入sql报错[Err] 1046 - No database selected

Navicat导入sql报错[Err] 1046 - No database selected ​ 今天系统重装了&#xff0c;就很完蛋。所有东西都重新下载安装。向Navicat导入sql的时候导入失败&#xff1a; 报错[Err] 1046 - No database selected。我很疑惑地又导了几次。当然又全都失败. 错误造成原因&#x…

ardupilot的固定翼飞行模式

飞行模式 APM所有的飞行模式都在对应的机型的文件夹下的mode.h里面有定义,针对于不同的模型,功能函数在基类中Mode中都是以纯虚函数实现了, 然后在继承的子类中重新实现它,以实现多态。 takeoff模式 参见网址在 ArduPlane 4.0 及更高版本中,自动起飞本身也是一种模式(…

Redis持久化策略——Java全栈知识(17)

Redis持久化 1、Redis 持久化的三种方式 1、RDB&#xff1a; 以快照的方式将此刻 Redis 中的数据以二进制的文件形式保存在磁盘中。 RDB 的优点是&#xff1a;快照文件小、恢复速度快&#xff0c;适合做备份和灾难恢复。 RDB 的缺点是&#xff1a;定期更新可能会丢数据&#…

20K薪资要什么水平?来看看25岁测试工程师的面试过程…_测试工程师薪资20k(2)

既有适合小白学习的零基础资料&#xff0c;也有适合3年以上经验的小伙伴深入学习提升的进阶课程&#xff0c;涵盖了95%以上软件测试知识点&#xff0c;真正体系化&#xff01; 由于文件比较多&#xff0c;这里只是将部分目录截图出来&#xff0c;全套包含大厂面经、学习笔记、…

阿里云最新重磅发布:通义千问2.5模型更强、5到10行代码搭建企业RAG应用、代码助手通义灵码推企业版

速览&#xff1a; 5月9日阿里云举办“阿里云AI智领者峰会”&#xff0c;会上发布一系列重磅产品&#xff0c;通义千问模型性能更强&#xff0c;通义灵码、阿里云百炼平台、通义千问App等均有重要信息发布。 会上阿里云发布正式发布通义千问2.5&#xff0c;中文性能全面赶超GPT-…

STM32G4做一个示波器

随着科技的飞速进步,曾经庞大笨重的示波器如今已经可以轻松装进口袋,随时随地揭示电子世界的奥秘。这不仅是技术革新的象征,更是便携实用性的极致演绎。最近,我发现了一个让人眼前一亮的小型示波器制作方案,它的心脏是STM32G4系列芯片。这个口袋大小的奇迹是如何成为可能的…

我们的小程序每天早上都白屏,真相是。。。

大家好&#xff0c;我是程序员鱼皮。最近我们在内测一款面试刷题小程序&#xff0c;没错&#xff0c;就是之前倒下的 “面试鸭”&#xff01; 在我们的内测交流群中&#xff0c;每天早上都会有同学反馈&#xff1a;打开小程序空白&#xff0c;没任何内容且登录不上。 然后过了…

PT:fix_eco_power用法

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 ICC2中没有直接修leakage/power的命令,需要在scenario status中设置leakage_power和dynamic_power的开关,结合place_opt/clock_opt.flow.enable_power true来使用。 innovus中专门的命令可以去优…

单例的命名重复

最近在开发的过程中&#xff0c;涉及到多个目录下&#xff0c;都由相同文件名和类名的单例&#xff0c;但是调用的时候编译器却知道调用哪个&#xff0c;所以学习了下&#xff0c;做个笔记。 DataInteraction *DataInteraction::instance() {static DataInteraction instance;…

单单单单单の刁队列

在数据结构的学习中&#xff0c;队列是一种常用的线性数据结构&#xff0c;它遵循先进先出&#xff08;FIFO&#xff09;的原则。而单调队列是队列的一种变体&#xff0c;它在特定条件下保证了队列中的元素具有某种单调性质&#xff0c;例如单调递增或单调递减。单调队列在处理…

游戏辅助 -- 三种分析角色坐标方法(CE、xdbg、龙龙遍历工具)

所用工具下载地址&#xff1a; https://pan.quark.cn/s/d54e7cdc55e6 在上次课程中&#xff0c;我们成功获取了人物对象的基址&#xff1a;[[[0xd75db8]1C]28]&#xff0c;而人物血量的地址则是基址再加上偏移量278。 接下来&#xff0c;我们需要执行以下步骤来进一步操作&a…

新版security demo(二)前端

写这篇博客&#xff0c;刚好换了台电脑&#xff0c;那就借着这个demo复习下VUE环境的搭建。 一、前端项目搭建 1、安装node 官网下载安装即可。 2、安装脚手架 npm install -g vue-cli 使用脚手架搭建一个demo前端项目 vue init webpack 项目名称 3、安装依赖 这里安装…

产品管理 | 产品文档模板

文章目录 环素 - 尿素订单管理系统功能需求&#xff08;一&#xff09;首页1.概述2.原型地址3.原型图及说明4.明细需求描述&#xff08;1&#xff09;新建订单 环素 - 尿素订单管理系统功能需求 &#xff08;一&#xff09;首页 1.概述 环素是一种集成的商品订单管理方案&am…