题目大意:给出一张n个点m条边的联通图,无重边,每条边有正反两个权值。现要从点1出发经过每条边每个点一次,问最大边权最小是多少。

最大最小容易想到二分,问题是如何判断是否有欧拉回路。

图不连通自然没有欧拉回路。
将大于限制的边设为不可走,新的图变成了混合图,即同时存在有向边和无向边。
首先,有向图的欧拉回路存在的条件是入度等于出度。
可以将无向边随意定向,默认从x到y。记一个点的度数为入度-出度。现在问题转化为如何转换无向边的方向使所有点的度数为0。若度数为奇数则一定没有欧拉回路因为将一条边反向会使一个点的度数加或减2,一定不可能得到0。

用网络流来判断。
对于每条无向边,y向x连边,流量为1,表示边可以反向。
对于每个点x,如果度数大于0,源点向x连边,否则x向汇点连边,流量为度数除以2,表示一个点的度数变成0需要的变化量。
如果满流则说明有欧拉回路

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define N 1005
#define INF 1000000000
using namespace std;
struct Data {int a,b,c,d;void scan() {scanf("%d%d%d%d",&a,&b,&c,&d);if(c>d) swap(c,d), swap(a,b);}
}g[N*2];
struct Edge {int from,to,nxt,cap;Edge() {}Edge(int _from,int _to,int _nxt,int _cap):from(_from),to(_to),nxt(_nxt),cap(_cap) {}
}e[N*10];
int n,m,tot=-1,S,T,fir[N],d[N],pa[N],deg[N];
int root(int x) { return pa[x]==x ? pa[x] : pa[x]=root(pa[x]); }
void Add_Edge(int from,int to,int cap) {e[++tot]=Edge(from,to,fir[from],cap), fir[from]=tot;e[++tot]=Edge(to,from,fir[to],0), fir[to]=tot;return ;
}
bool bfs() {queue<int> q;for(int i=S;i<=T;++i) d[i]=-1;d[S]=0, q.push(S);while(!q.empty()) {int x=q.front(); q.pop();for(int i=fir[x];~i;i=e[i].nxt) {if(!e[i].cap || d[e[i].to]!=-1) continue;d[e[i].to]=d[x]+1;if(e[i].to==T) return true;q.push(e[i].to);}}return false;
}
int dfs(int x,int now) {if(!now || x==T) return now;int f,flow=0;for(int i=fir[x];~i;i=e[i].nxt) {if(d[e[i].to]!=d[x]+1) continue;f=dfs(e[i].to,min(e[i].cap,now));if(!f) continue;e[i].cap-=f, e[i^1].cap+=f;now-=f, flow+=f;if(!now) break;}if(!flow) d[x]=-1;return flow;
}
int Dinic() {int maxflow=0;while(bfs()) maxflow+=dfs(S,INF);return maxflow;
}
bool check(int lim) {fir[S]=fir[T]=-1;tot=-1;for(int i=1;i<=n;++i) pa[i]=i, deg[i]=0, fir[i]=-1;int cnt=n;for(int i=1;i<=m;++i) {if(g[i].d<=lim) {++deg[g[i].a], --deg[g[i].b];int pa_a=root(g[i].a),pa_b=root(g[i].b);if(pa_a!=pa_b) pa[pa_a]=pa_b, --cnt;Add_Edge(g[i].a,g[i].b,1);}else if(g[i].c<=lim) {--deg[g[i].a], ++deg[g[i].b];int pa_a=root(g[i].a),pa_b=root(g[i].b);if(pa_a!=pa_b) pa[pa_a]=pa_b, --cnt;}}if(cnt>1) return false;for(int i=1;i<=n;++i) {if(deg[i]&1) return false;if(deg[i]>0) Add_Edge(S,i,deg[i]>>1);else Add_Edge(i,T,-deg[i]>>1);}Dinic();for(int i=fir[S];~i;i=e[i].nxt)if(e[i].cap) return false;return true;
}
int main() {scanf("%d%d",&n,&m);T=n+1;for(int i=1;i<=m;++i) g[i].scan();int l=1,r=1001,mid,ans=-1;while(l<=r) {mid=l+r>>1;if(check(mid)) ans=mid, r=mid-1;else l=mid+1;}if(ans==-1) puts("NIE");else printf("%d\n",ans);return 0;
}

BZOJ 2095 [Poi2010]Bridges 二分 最大流(混合图欧拉回路)相关推荐

  1. 2095: [Poi2010]Bridges 二分+混合图欧拉回路(网络流)

    好厉害的题啊QAQ,并不会做. 最大值最小想到是二分,然后就是一个混合图欧拉回路的问题. 混合图欧拉回路问题的解决: 我们首先想到有向图的欧拉回路,需满足的条件是每个点的入度等于出度.那么对于一个混合 ...

  2. BZOJ 2095: [Poi2010]Bridges

    题意:题目的翻译是有点问题的,其实是在一个无向图中找一条最大边权最小的欧拉回路. 首先二分最大边权,然后把超过的边删掉,这样这张图就变成了一个混合图(既有有向边也有无向边),我们借助网络流来判断是否存 ...

  3. BZOJ 2095 [POI2010]Bridges (最大流、欧拉回路)

    洛谷上有这题,但是输出方案缺SPJ..(而且我也懒得输出方案了) 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2095 题解: 首先判 ...

  4. BZOJ 2095: [Poi2010]Bridges 混合图欧拉回路

    YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到另外任意一个小岛.现在YYD想骑单车从小岛1出发,骑过每一座桥,到达 ...

  5. bzoj2095: [Poi2010]Bridges 二分+最大流

    想当年第一次看到这个题是在**p的一套模拟题里?然后当时想过二分也想过最大流.然后就是没有想到一块,最后知道做法后就不了了之了. #include <iostream> #include ...

  6. Bzoj2095:[Poi2010]Bridges:混合图欧拉回路,网络流

    题目链接:2095:[Poi2010]Bridges 二分答案建图后显然是混合图的欧拉回路,有向边删掉无向边随机定向计算入度-出度的差du[i],如果du[i]<0连边(i,T,-du[i]/2 ...

  7. [BZOJ2095][Poi2010]Bridges 最大流(混合图欧拉回路)

    2095: [Poi2010]Bridges Time Limit: 10 Sec  Memory Limit: 259 MB Description YYD为了减肥,他来到了瘦海,这是一个巨大的海, ...

  8. BZOJ2095 POI2010 Bridges 【二分+混合图欧拉回路】

    BZOJ2095 POI2010 Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛 ...

  9. TZOJ 2099 Sightseeing tour(网络流判混合图欧拉回路)

    描述 The city executive board in Lund wants to construct a sightseeing tour by bus in Lund, so that to ...

最新文章

  1. .NET中使用OracleHelper
  2. nagios mysql php_nagios监控mysql
  3. thinkphp curd的事务回滚 一看就会
  4. safari 获取视频流_如何在Safari中将RSS feed和社交媒体合并为一个流
  5. AFN\HTTPS\UIWebView
  6. c语言中数据存储在文件中,急求如何将下列C语言程序数据存储到文件中?
  7. 应用层协议:HTTPS
  8. 单选 textarea 赋初值
  9. matlab求零空间,【线性代数】矩阵的零空间
  10. 电脑键盘下划线怎么打_苹果电脑键盘失灵怎么办,维护方法!
  11. 案例 -- web移动端项目(vue)
  12. JavaCV开发详解之27:使用javacv把视频切割成多个视频分片文件,以mp4为例,把视频切割成MP4分片文件
  13. vue3 - composition api
  14. 修复 Windows 10 设置界面里面混乱的语言翻译
  15. 读路遥两本书的感悟《人生》《平凡的世界》
  16. vue-loader was used without the corresponding plugin.
  17. Python高级全栈开发实战 老男孩课程S16+路飞学城项目+女神串讲 Python全栈直通车课程
  18. Linux socket编程(一):客户端服务端通信、解决TCP粘包
  19. 【华为机试】HJ16 购物单
  20. 超详细的逐句介绍Java网络编程之Socket类函数源码讲解(全)

热门文章

  1. Delphi idFTP
  2. el-table树结构的搜索---递归遍历
  3. 微信小程序开发之——音乐播放器-音乐推荐
  4. 新闻与传播c刊_新闻专业有什么核心期刊
  5. 解决idea依赖的包突然失效,本地的maven仓库也有,但是代码里面就是引不进来的问题
  6. 对于tomcat升级导致游览器访问页面出现的中文乱码问题解决方案
  7. 系統封裝(6)--EZBOOT設置
  8. 大数据如何学习,告诉你正确的学习姿势
  9. centos7安装docker以及部署centos7:lastest
  10. html认识时间游戏,认识时间教学设计