【BZOJ2095】【POI2010】Bridge 网络流

题目大意

​  给你一个无向图,每条边的两个方向的边权可能不同。要求找出一条欧拉回路使得路径上的边权的最大值最小。无解输出"NIE"。
  \(2\leq n\leq 1000,1\leq m\leq 2000\)

题解

​  我们先二分答案\(ans\),把边权大于\(ans\)的边删掉。

​  现在图中还剩下一些有向边和一些无向边,也就是说这是一个混合图。

​  混合图的欧拉回路怎么求?

​  先把无向边定向(方向任意),求出每个点的出度\(d1_i\)和入度\(d2_i\)。如果存在点\(i\)使得\(|d1_i-d2_i|\)为奇数,则无解。因为你怎么反向都不可能把\(d1_i-d2_i\)变成\(0\)

​  然后把无向边按定向的反方向在图中连边,容量为\(1\)。对于一个点\(i\),如果\(d1_i>d2_i\),则连边\(i\text{->}T\),容量为\(\frac{d1_i-d2_i}{2}\),否则连边\(S\text{->}i\),容量为\(\frac{d2_i-d1_i}{2}\)

​  最后跑一次最大流。如果满流就有解,否则无解。

  还要用并查集判一下是不是连通图。

​  为什么这是对的?每流过一条边就表示把这条边反向。对这个网络求最大流就是调整尽可能多的边。流量平衡就表示一个点的入度和出度相同。

这里写图片描述

​  这个图把边定向得到

​  这里写图片描述

​  建图后跑最大流可以得到

  这里写图片描述

​  把满流边反向后得到

  这里写图片描述

​  这就是一个欧拉回路了

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
struct list
{int v[100010];int w[100010];int t[100010];int h[1010];int n;void clear(){memset(h,0,sizeof h);n=0;}void add(int x,int y,int z){n++;v[n]=y;w[n]=z;t[n]=h[x];h[x]=n;}
};
list l;
void add(int x,int y,int z)
{l.add(x,y,z);l.add(y,x,0);
}
int d[1010];
int S,T;
int bfs()
{memset(d,-1,sizeof d);queue<int> q;q.push(S);d[S]=0;int x,i;while(!q.empty()){x=q.front();q.pop();for(i=l.h[x];i;i=l.t[i])if(l.w[i]&&d[l.v[i]]==-1){d[l.v[i]]=d[x]+1;if(l.v[i]==T)return 1;q.push(l.v[i]);}}return 0;
}
int op(int x)
{return ((x-1)^1)+1;
}
int dfs(int x,int flow)
{if(x==T)return flow;int c,s=0,i;for(i=l.h[x];i;i=l.t[i])if(l.w[i]&&d[l.v[i]]==d[x]+1){c=dfs(l.v[i],min(flow,l.w[i]));s+=c;flow-=c;l.w[i]-=c;l.w[op(i)]+=c;if(!flow)break;}return s;
}
int f[1010];
int find(int x)
{return f[x]==x?x:f[x]=find(f[x]);
}
int lx[2010],ly[2010],w1[2010],w2[2010];
int d1[2010],d2[2010];
int c[2010];//方向 
int n,m;
int abs(int x)
{return x>0?x:-x;
}
int check(int p)
{memset(d1,0,sizeof d1);memset(d2,0,sizeof d2);int i;for(i=1;i<=n;i++)f[i]=i;for(i=1;i<=m;i++){if(p<w1[i]&&p<w2[i])return 0;if(p>=w1[i]){c[i]=0;d1[lx[i]]++;d2[ly[i]]++;f[find(lx[i])]=find(ly[i]);}else{c[i]=1;d1[ly[i]]++;d2[lx[i]]++;f[find(lx[i])]=find(ly[i]);}}for(i=1;i<=n;i++){if(abs(d1[i]-d2[i])&1)return 0;if(i>1&&find(i)!=find(i-1))return 0;}l.clear();S=n+1;T=n+2;for(i=1;i<=m;i++)if(p>=w1[i]&&p>=w2[i])add(ly[i],lx[i],1);
//      else
//          add(lx[i],ly[i],1);int s=0,ans=0;for(i=1;i<=n;i++)if(d1[i]>d2[i]){add(i,T,(d1[i]-d2[i])/2);s+=(d1[i]-d2[i])/2;}else if(d1[i]<d2[i])add(S,i,(d2[i]-d1[i])/2);while(bfs())ans+=dfs(S,0x7fffffff);return ans==s;
}
int main()
{
//  freopen("bzoj2095.in","r",stdin);scanf("%d%d",&n,&m);int i;for(i=1;i<=m;i++)scanf("%d%d%d%d",&lx[i],&ly[i],&w1[i],&w2[i]);int l=1,r=1001;int mid;while(l<r){mid=(l+r)>>1;if(check(mid))r=mid;elsel=mid+1;}if(l>1000)printf("NIE\n");elseprintf("%d\n",l);return 0;
}

转载于:https://www.cnblogs.com/ywwyww/p/8510609.html

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

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

相关文章

space index.php 7-14,SpacePack高效部署PHP生产环境

SpacePack 基于 Docker 为了快速部署 PHP 生产环境而产生的项目&#xff0c;它包含了一般项目中常用的组件&#xff0c;能够在最短的时间内产生一个完善并且优化过的 PHP 生产环境。容器版本SpacePack 默认包含了 OpenResty 1.13、PHP 7.2、MariaDB 10.3、Memcached 1.5、Redis…

【XSY2469】graph 分治 并查集

题目大意 给你一张\(n\)个点\(m\)条边的无向图&#xff0c;问删去每个点后&#xff0c;原图是不是二分图。 \(n,m\leq 100000\) 题解 一个图是二分图\(\Longleftrightarrow\)该图不存在奇环 可以用并查集&#xff0c;维护每个点到根的距离 如果删除\(x\)点&#xff0c;就要把所…

云播自带解析php,使用PHP SDK,web端的华为云视频点播接入,加密视频播放的坑与解决方案-全代码篇...

下载phpdemo算是跑起来了&#xff0c;现在就要考虑租户系统如自身验证token的问题了。1、先介绍下我的代码目录2、文件执行的时序图和流程图2、代码demotest.phpfunction curl_request($url,$post,$cookie, $returnCookie0){$curl curl_init();curl_setopt($curl, CURLOPT_URL…

Matlab 常用语法速记 1

快捷帮助 查找帮助&#xff1a;doc 函数名 强制终止&#xff1a; ctrl c 注释&#xff1a; % 清屏 clc&#xff0c;清临时变量窗口 clear NaN: not a number inf: infinite 创建矩阵 列向量&#xff1a;vecx [1 2 3 4]; vecy [1 2 3]; 矩阵&#xff1a;matA [11 12 13 14…

php获取h5视频直链,一种H5播放实时视频的方法与系统与流程

本发明涉及播放实时视频&#xff0c;尤其涉及一种h5播放实时视频的方法与系统。背景技术&#xff1a;h5是指第5代html&#xff0c;也指用h5语言制作的一切数字产品。所谓html是“超文本标记语言”的英文缩写。“超文本”是指页面内可以包含图片、链接&#xff0c;甚至音乐、程序…

移动端中的陀螺仪

横竖屏 window下的orientation属性来表示移动端的横竖屏状态&#xff0c;chrome模拟器不支持该属性&#xff0c;只能在真机上测试 window.orientation 按照上右下左的顺序&#xff0c;该属性的结果分别是0、90、180、-90 [注意]手机头朝下的切换没有实现 window下的orientation…

php 收缩栏,HTML5每日一练之details展开收缩标签的应用

HTML5每日一练之details展开收缩标签的应用details标签的出现&#xff0c;为我们带来了更好的用户体验&#xff0c;不必为这种收缩展开的效果再编写JS来实现。注&#xff1a;目前仅Chrome支持此标签。details有一个新增加的子标签——summary&#xff0c;当鼠标点击summary标签…

博客阅读和思考

1.关于当初 选择说来惭愧&#xff0c;当初选择专业之时&#xff0c;我并没有认真审视过所有专业&#xff0c;没有自己感兴趣的专业方向.是父母帮我选择了软件工程这个方向&#xff0c;他们说IT行业发展前景好&#xff0c;以后不愁工作.我想想&#xff0c;也是这样的.于是稀里糊…

oracle行列互换sql,解决Oracle行列转换问题的一个方法

不好意思&#xff0c;编译错误&#xff0c;可能是版本的问题其实&#xff0c;实现的方法很简单&#xff0c;请参考精华帖子下面是源文件 &#xff0c;我是的数据库版本是9.2.0.1&#xff0c;OS为NT[PHP]---Author: Accelerator---Date : 2004-11-25create or replace type lis…

zufeoj 分数线划定

分数线划定 时间限制: 1 Sec 内存限制: 128 MB提交: 13 解决: 7[提交][状态][讨论版]题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才&#xff0c;A市对所有报名的选手进行了笔试&#xff0c;笔试分数达到面试分数线的选手方可进入面试。面试…

php 主进程子进程,PHP中的子进程的任何等价物?

通过双向通信,您可以访问stdin,stdout和stderr的最接近的等价物是proc_open().以下是文档中的示例&#xff1a;$descriptorspec array(0 > array("pipe", "r"), // stdin is a pipe that the child will read from1 > array("pipe", &quo…

oracle只读事物,oracle的只读事务

一致性读是oracle区别于其他数据库的重要特点之一&#xff0c;但一般来说&#xff0c;这个一致性读是sql级别的&#xff0c;只针对单个sql有效。由于业务逻辑需要&#xff0c;我们可能需要在一个事务中的多个sql也能实现读一致性&#xff0c;也就是说&#xff0c;数据源在事务开…

获得网页中元素的位置

网页大小&#xff1a; clientWidth和clientHeight。 最快速的方法&#xff1a;getBoundingClientRect() 获得top, right, bottom, left&#xff0c;是获得元素距离viewport的左上角。 获得元素的相对位置&#xff1a;不断向父元素获得offsetHeight和offsetWidth。 获得元素的绝…

实验一 软件工程准备

1、实验目的与要求 &#xff08;1&#xff09; 学习通过博客园软件开发者学习社区的协作与支持完成软件工程课程学习的技巧和经验。 &#xff08;2&#xff09; 掌握Github操作&#xff1b; 2、实验内容和步骤 任务1&#xff1a;在以下网址提交课程调查问卷&#xff1a;https:/…

matlab气相分解反应动力学,第十二章 化学动力学.ppt

快反应 慢反应 速控法 稳态法 (1) 一级反应 (2) 二级反应 高压时 低压时 RRKM理论 12.7 光化学反应 * 物理化学(下) PHYSICAL CHEMISTRY (11) 碰撞理论 单分子反应理论 过渡态理论 光化学反应 催化反应动力学 本章主要内容&#xff1a; 12 化学动力学基础(二) 反应速率理论 碰撞…

深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)

http://blog.csdn.net/u014595019/article/details/52989301转载于:https://www.cnblogs.com/mdumpling/p/8527799.html

基础题

1&#xff0c;别名&#xff0c;内部&#xff0c;外部&#xff0c;hash优先级&#xff1f; 2&#xff0c;screen协助 1.一台screen -S 协助名称 2.另外一台screen -ls 列出目前开的协助会话&#xff08;session&#xff09;&#xff0c;找到上面协助名称对应的session号。 3. sc…

oracle查询字段精度,【Oracle】查询字段的长度、类型、精度、注释等信息

在mysql中alter命令可以修改字段类型,长度,名称或一些其它的参数,下面我来给大家介绍alter函数修改字段长度与类型的两个命令,希望文章来给各位带来帮助. mysql 修改字段长度 alter table news modify column title varchar(130); alter table 表名 modify column 字段名 …

linux改文件后run,linux下.run文件如何安装与卸载

w 表示可写入&#xff0c;其中 u 表示该档案的拥有者&#xff0c;有个 uninstall 文件&#xff0c; r 表示可读取&#xff0c;利用 chmod 可以藉以控制档案如何被他人所调用。执行./uninstall就ok了 下面是其他网友的补充&#xff1a; 比如安装QT编程软件 安装方法如下 命令第一…

leetcode链表题

1. sort_list Sort a linked list in O(n log n) time using constant space complexity. 分析&#xff1a;时间复杂度是nlogn,所以可以考虑归并排序。取中点&#xff0c;对左边和右边分别递归排序&#xff0c;最后合并。 知识点&#xff1a;快慢指针&#xff0c;用来取链表中点…