Bridges
Bridges
题目描述
YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到另外任意一个小岛。现在YYD想骑单车从小岛1出发,骑过每一座桥,到达每一个小岛,然后回到小岛1。霸中同学为了让YYD减肥成功,召唤了大风,由于是海上,风变得十分大,经过每一座桥都有不可避免的风阻碍YYD,YYD十分ddt,于是用泡芙贿赂了你,希望你能帮他找出一条承受的最大风力最小的路线。
输入
输入:第一行为两个用空格隔开的整数n(2<=n<=1000),m(1<=m<=2000),
接下来读入m行由空格隔开的4个整数a,b(1<=a,b<=n,a<>b),c,d(1<=c,d<=1000),
表示第i+1行第i座桥连接小岛a和b,从a到b承受的风力为c,从b到a承受的风力为d。
输出
输出:如果无法完成减肥计划,则输出NIE,否则第一行输出承受风力的最大值(要使它最小)
样例输入
4 4
1 2 2 4
2 3 3 4
3 4 4 4
4 1 5 4
样例输出
4
提示

solution
题目不怎么严谨。。。
反正求一条欧拉回路,要求最大边权最小。
欧拉回路
无向图:所有点度数均为偶数且图联通。
有向图:所有点入度等于出度且图联通。
因为答案有单调性首先二分出mid,把大于mid的边拎出来。
这是一张混合图,我们给无向边先随便定一个向。
统计点的入度和出度,如果abs(in-out)&1 那么一定不合法。
因为翻转一条无向边会带来+-2的收益。
我们想怎么去维护欧拉回路。
若in[i]>out[i],则lj(S,i,(in[i]-out[i])/2)
否则lj(i,T,(out[i]-in[i])/2)。
判断最大流是否等于所有(in-out)/2(in>out)即可。
反向边流量我赋值成t3。。真是傻
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define maxn 1005
#define inf 1e9
using namespace std;
int n,m,l,r,Max,tot,S,T,head[maxn];
int in[maxn],out[maxn],d[maxn],flag[maxn],cur[maxn];
queue<int>q;
struct node{
int a,b,c,d;
}s[2002];
struct no{
int v,nex,cap;
}e[200005];
void lj(int t1,int t2,int t3){
e[++tot].v=t2,e[tot].cap=t3;e[tot].nex=head[t1];head[t1]=tot;
e[++tot].v=t1,e[tot].cap=0;e[tot].nex=head[t2];head[t2]=tot;
}
bool BFS(){
for(int i=1;i<=T;i++)d[i]=inf;
d[S]=0;q.push(S);
while(!q.empty()){
int x=q.front();q.pop();
cur[x]=head[x];
for(int i=head[x];i;i=e[i].nex){
if(d[e[i].v]>d[x]+1&&e[i].cap>0){
d[e[i].v]=d[x]+1;
if(!flag[e[i].v]){
flag[e[i].v]=1;q.push(e[i].v);
}
}
}
flag[x]=0;
}
return d[T]!=inf;
}
int lian(int k,int a){
if(k==T||!a)return a;
int f,flow=0;
for(int &i=cur[k];i;i=e[i].nex){
if(d[e[i].v]==d[k]+1&&(f=lian(e[i].v,min(e[i].cap,a)))>0){
e[i].cap-=f;e[i^1].cap+=f;
a-=f;flow+=f;
if(!a)break;
}
}
return flow;
}
bool pd(int mid)
{
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(head,0,sizeof(head));
tot=1;
for(int i=1;i<=m;++i)
{
if(s[i].c<=mid&&s[i].d<=mid){in[s[i].a]++,out[s[i].b]++,lj(s[i].a,s[i].b,1);continue;}
if(s[i].c<=mid)out[s[i].a]++,in[s[i].b]++;
else if(s[i].d<=mid)out[s[i].b]++,in[s[i].a]++;
else return false;
}
S=0;T=n+1;int sum=0,ans=0;
for(int i=1;i<=n;++i)
{
if((in[i]-out[i])%2)return false;
if(in[i]>out[i])lj(S,i,(in[i]-out[i])/2),sum+=(in[i]-out[i])/2;
else lj(i,T,(out[i]-in[i])/2);
}
while(BFS())ans+=lian(S,1e9);
return ans==sum;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&s[i].a,&s[i].b,&s[i].c,&s[i].d);
}
l=0,r=1005;
while(l<r){
int mid=(l+r)/2;
if(pd(mid))r=mid;
else l=mid+1;
}
if(r==1005)puts("NIE");
else cout<<r<<endl;
return 0;
}
假设定向(u,v)
那么就在网络流的图中连(v,u,1)
有流表示反向
Bridges的更多相关文章
- hdu 4738 Caocao's Bridges 图--桥的判断模板
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- POJ2288 Islands and Bridges
Description Given a map of islands and bridges that connect these islands, a Hamilton path, as we al ...
- HDU 4738 Caocao's Bridges(Tarjan求桥+重边判断)
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 4738 Caocao's Bridges
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- ZOJ 2588 Burning Bridges(求含重边的无向连通图的割边) - from lanshui_Yang
Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little country ...
- zoj 2588 Burning Bridges【双连通分量求桥输出桥的编号】
Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ...
- hdoj 4738 Caocao's Bridges【双连通分量求桥】
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- bzoj 2095: [Poi2010]Bridges [混合图欧拉回路]
2095: [Poi2010]Bridges 二分答案,混合图欧拉路判定 一开始想了一个上下界网络流模型,然后发现不用上下界网络流也可以 对于无向边,强制从\(u \rightarrow v\),计算 ...
- Luogu4655 [CEOI2017]Building Bridges
Luogu4655 [CEOI2017]Building Bridges 有 \(n\) 根柱子依次排列,每根柱子都有一个高度.第 \(i\) 根柱子的高度为 \(h_i\) . 现在想要建造若干座桥 ...
- loj#2483. 「CEOI2017」Building Bridges 斜率优化 cdq分治
loj#2483. 「CEOI2017」Building Bridges 链接 https://loj.ac/problem/2483 思路 \[f[i]=f[j]+(h[i]-h[j])^2+(su ...
随机推荐
- python_65_生成器1
# map()函数 # map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. # 例 ...
- 一些常用的集合工具的代码块(缓慢更新XD,更新了多属性过滤:) )
更新记录 虽然经常放鸽子,但是还是要记录一下更新 2017.8.30 更新了listToMap的方法,现在可以指定多个属性进行分组了,例如你要指定一个学生集合,按照名字和年龄相同的放在一组,现在只要调 ...
- BZOJ2023: [Usaco2005 Nov]Ant Counting 数蚂蚁(dp)
题意 题目描述的很清楚... 有一天,贝茜无聊地坐在蚂蚁洞前看蚂蚁们进进出出地搬运食物.很快贝茜发现有些蚂蚁长得几乎一模一样,于是她认为那些蚂蚁是兄弟,也就是说它们是同一个家族里的成员.她也发现整个 ...
- 2018.11.5 Nescafe26 T1 小猫爬山
题目 题目描述 Freda 和 rainbow 饲养了 N 只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们 终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). Fre ...
- python 使用requests 请求 https 接口 ,取消警告waring
response = requests.request("POST", url, timeout=20, data=payload, headers=headers, proxie ...
- Centos7在运行yum命令时出现报错及排查处理过程
1.1 现象描述 Centos系统在正常重启后,运行yum命令安装软件工具的时候出现以下报错: cannot open Packages index using db5 - Structure ne ...
- crontab -e 和/etc/crontab的区别
/etc/crontab文件和crontab -e命令区别/etc/crontab文件和crontab -e命令区别 1.格式不同 前者 # For details see man 4 crontab ...
- 【PHP】php中json_decode()和json_encode()
1.json_decode() json_decode (PHP 5 >= 5.2.0, PECL json >= 1.2.0) json_decode — 对 JSON 格式的字符串进行 ...
- PHP操作redis的常用例子
Redis常用的例子 1,connect 描述:实例连接到一个Redis. 参数:host: string,port: int 返回值:BOOL 成功返回:TRUE;失败返回:FALSE 示例: &l ...
- 【php】session_start 报 no such file
如果是yum安装修改php-fpm.conf 里面的 session.save_path 如果是编译的,修改php.ini 的session.save_path (此条未测试)