BZOJ 2095: [Poi2010]Bridges
题意:题目的翻译是有点问题的,其实是在一个无向图中找一条最大边权最小的欧拉回路。
首先二分最大边权,然后把超过的边删掉,这样这张图就变成了一个混合图(既有有向边也有无向边),我们借助网络流来判断是否存在欧拉回路。一个有向图存在欧拉回路的充要条件是每个点入度=出度,对于一条无向边,我们随便给一个方向,计算每个点的in[i]和out[i].对于in[i]>out[i]的点,由S向i连一条(in[i]-out[i])/2的边,否则由i向T连一条(out[i]-in[i])/2的边,对于前面的无向边,假设我们给的方向是由U到V,则由V连一条为1的边到U,跑最大流,如果可以满流则证明存在。
Tips:如果有点in和out都为0或者相减为奇数则必不存在,这种情况要特判
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int maxn=1000+10;
const int INF=1000000000;
int in[maxn],out[maxn],dis[maxn],cur[maxn],vis[maxn],n,m,s,t,l=1,r=1000,ans=0,flag[maxn];
struct node
{int u,v,a,b;
}e[maxn*2];
struct edge
{int from,to,cap,flow;
};
vector<int> g[maxn];
vector<edge> edges;
void addedge(int from,int to,int cap)
{edges.push_back((edge){from,to,cap,0});edges.push_back((edge){to,from,0,0});int m1=edges.size();g[from].push_back(m1-2);g[to].push_back(m1-1);
}
bool bfs()
{memset(vis,0,sizeof(vis));queue<int> Q;Q.push(s);vis[s]=1;dis[s]=0;while(!Q.empty()){int x=Q.front();Q.pop();for(int i=0;i<g[x].size();i++){edge e=edges[g[x][i]];if(e.cap>e.flow&&!vis[e.to]){vis[e.to]=1;dis[e.to]=dis[x]+1;Q.push(e.to);}}}return vis[t];
}
int dfs(int x,int a)
{if(x==t||a==0) return a;int flow=0,f;for(int &i=cur[x];i<g[x].size();i++){edge &e=edges[g[x][i]];if(dis[e.to]==dis[x]+1&&(f=dfs(e.to,min(a,e.cap-e.flow)))>0){flow+=f;e.flow+=f;edges[g[x][i]^1].flow-=f;a-=f;if(a==0) break;}}return flow;
}
int maxflow()
{int flow=0;while(bfs()){memset(cur,0,sizeof(cur));flow+=dfs(s,INF);}return flow;
}
bool check(int hm)
{edges.clear();s=0,t=n+1;for(int i=s;i<=t;i++) g[i].clear();for(int i=1;i<=n;i++) in[i]=out[i]=0;for(int i=1;i<=m;i++){if(e[i].a<=hm){out[e[i].u]++;in[e[i].v]++;}if(e[i].b<=hm) addedge(e[i].v,e[i].u,1);}int num=0;for(int i=1;i<=n;i++)if(in[i]>out[i]){addedge(s,i,(in[i]-out[i])/2);num+=(in[i]-out[i])/2;}else addedge(i,t,(out[i]-in[i])/2);for(int i=1;i<=n;i++) if((in[i]-out[i])&1||in[i]==0&&out[i]==0) return false;if(maxflow()==num) return true;else return false;
}
int main()
{freopen("data.in","r",stdin);freopen("data.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d%d%d",&e[i].u,&e[i].v,&e[i].a,&e[i].b);if(e[i].a>e[i].b){swap(e[i].a,e[i].b);swap(e[i].u,e[i].v);}}int l=1,r=1000;while(l<=r){int mid=(l+r)>>1;if(check(mid)){ans=mid;r=mid-1;}else l=mid+1;}if(ans) printf("%d\n",ans);else puts("NIE");return 0;
}
BZOJ 2095: [Poi2010]Bridges相关推荐
- BZOJ 2095 [POI2010]Bridges (最大流、欧拉回路)
洛谷上有这题,但是输出方案缺SPJ..(而且我也懒得输出方案了) 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2095 题解: 首先判 ...
- BZOJ 2095: [Poi2010]Bridges 混合图欧拉回路
YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到另外任意一个小岛.现在YYD想骑单车从小岛1出发,骑过每一座桥,到达 ...
- BZOJ 2095 [Poi2010]Bridges 二分 最大流(混合图欧拉回路)
题目大意:给出一张n个点m条边的联通图,无重边,每条边有正反两个权值.现要从点1出发经过每条边每个点一次,问最大边权最小是多少. 最大最小容易想到二分,问题是如何判断是否有欧拉回路. 图不连通自然没有 ...
- 2095: [Poi2010]Bridges 二分+混合图欧拉回路(网络流)
好厉害的题啊QAQ,并不会做. 最大值最小想到是二分,然后就是一个混合图欧拉回路的问题. 混合图欧拉回路问题的解决: 我们首先想到有向图的欧拉回路,需满足的条件是每个点的入度等于出度.那么对于一个混合 ...
- [BZOJ2095][Poi2010]Bridges 最大流(混合图欧拉回路)
2095: [Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MB Description YYD为了减肥,他来到了瘦海,这是一个巨大的海, ...
- Bzoj2095:[Poi2010]Bridges:混合图欧拉回路,网络流
题目链接:2095:[Poi2010]Bridges 二分答案建图后显然是混合图的欧拉回路,有向边删掉无向边随机定向计算入度-出度的差du[i],如果du[i]<0连边(i,T,-du[i]/2 ...
- bzoj2095 [Poi2010]Bridges
bzoj [Poi2010]Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到 ...
- BZOJ2095[Poi2010] Bridges
BZOJ2095[Poi2010] Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小 ...
- BZOJ2095 POI2010 Bridges 【二分+混合图欧拉回路】
BZOJ2095 POI2010 Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛 ...
最新文章
- 学会 IDEA REST Client后,postman就可以丢掉了...
- oracle-Oracle试题
- ZOJ 1610 Count the Colors (线段树区间更新)
- 为iOS7重新设计你的App
- 华为手机锁屏上显示广告遭用户吐槽 官方回应:不是我们干的
- python制作u盘病毒_十行代码--用Python写一个USB病毒!
- php 内部 邮件,php电子邮件形式内部服务器错误
- SimpleFs文件系统初步四(Inode的创建过程)
- 均衡器算法_必须像算法一样对算法进行仔细调整。 怎么样? 算法均衡器
- PMP-全书知识重点图
- 国内知名的java商城系统排名
- pythonturtle艺术字_字体风格迁移,卷积神经网络打败艺术字,生成最美汉字
- matlab实现手绘风格(简笔画风格、漫画风格)的曲线绘图
- 【CodeForces 574B】Bear and Three Musketeers
- 素数和(5分) 题目内容: 我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。 现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的
- layui怎么给下拉框赋值_layui给select下拉框赋值
- LoadLibrary下错误返回126错误码排查过程
- 【微信小程序WXS 模块】
- Vmware虚拟机下三种网络模式配置
- 国内的windows硬件检测软件算是很牛逼的吧!!!?
热门文章
- altium designer 出gerber文件时一个小问题的解决
- oracle的dump头文件用ue显示,关于Oracle dmp文件导入随笔
- 刚在在win8.1下装了ubuntu12.04
- 【双目视觉】 SGBM算法应用(Python版)
- Android 用Groovy实现扇贝阅读APP的自动阅读功能
- 为祖国庆生, 我们都经历了些什么?
- java 压缩oop_JVM优化之压缩普通对象指针(CompressedOops)
- Esp8266进阶之路16 esp8266的 基于Nonos移植红外线H1838,实现红外遥控器配网,远程控制一盏灯。(附带固件)
- 用 canvas 操作图片像素
- 3月28日服务器维护,神武3月28日维护公告:新场景地图开放