[POJ1637]混合图的欧拉回路判定|网络流
混合图的欧拉回路判定
上一篇正好分别讲了有向图和无向图的欧拉回路判定方法
如果遇上了混合图要怎么做呢?
首先我们思考有向图的判定方法:所有点的出度=入度
我们可以先为无向边任意定一个向,算出此时所有顶点的入度和出度
对于一个入度<>出度的点,我们修改与它相连的一条无向边的方向,一种可能是入度-1出度+1,一种可能是入度+1出度-1
无论如何不会改变的是其入度与出度的差一直是偶数
所以首先我们对任意定向后的整张图根据其入度与出度之差进行初步判定
有顶点入度与出度之差为奇数的图一定无法构成欧拉回路
接下来继续看,对于每一条任意定向的无向边:

我们改变了方向之后可以将a[u]-b[u]的差增加2,将a[v]-b[v]的差减小2
我们可以根据a[i]与b[i]的差计算出要使a[i]=b[i]时需要几条原来从a[i]出发的边反向
同时要考虑到a[i]也可能作为原来作为终点
我们可以据此建立起网络流的模型
建立一个源点s和一个汇点t
对于所有a[i]>b[i]的点,从s到i建立一条容量为c=(a[i]-b[i]) >> 1的边(如果这些流量都流完了,点i的出入度就相同了
我们期望流过c流量的边,我们希望通过c条原本起点为i的边反转从而达到这样的目的
同样的,对于所有a[i]<b[i]的点,从i到t建立一条容量为(b[i]-a[i]) >> 1的边(如果这些流量流完了,点i的出入度就相同了
我们期望流过c流量的边,通过c条原本终点为i的边反转
当然不排除尽管位于左侧但仍然要作为终点的情况,这个时候增加的a[i]-b[i]的差我们要通过更多原本以i为起点的边反转
网络流正好满足这个性质,从其他点流过来的流量我们需要推出去更多的流量
所以对于原本定向为(x,y)的边,我们从x到y连一条流量为1的边
为了优化这个操作,使边数更小,我们可以累计x到y的边,最后加边
这里思考一下为什么不能将每条边当做的流量乘二,与源点汇点的流量不用除以2
这就防止了一条边被拆做两个半条用的情况
至于怎样才算成功,即所有从源点发出去的流量=留回汇点的流量
附上原题描述以及代码
Sightseeing tour
Description
The city executive board in Lund wants to construct a sightseeing tour by bus in Lund, so that tourists can see every corner of the beautiful city. They want to construct the tour so that every street in the city is visited exactly once. The bus should also start and end at the same junction. As in any city, the streets are either one-way or two-way, traffic rules that must be obeyed by the tour bus. Help the executive board and determine if it's possible to construct a sightseeing tour under these constraints.program poj1637;
const maxn=;maxm=;
var fa,next,w,rec:array[-..maxm]of longint;
opt,link,dis,a,b:array[-..maxn]of longint;
t,test,n,m,ans,j,s,tt,i:longint;
e:array[-..maxm]of record x,y,z:longint;end;
c:array[-..maxn,-..maxn]of longint; function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end; procedure add(x,y,z:longint);
begin
inc(j);fa[j]:=y;next[j]:=link[x];link[x]:=j;w[j]:=z;rec[j]:=j+;
inc(j);fa[j]:=x;next[j]:=link[y];link[y]:=j;w[j]:=;rec[j]:=j-;
end; function spfa:boolean;
var head,tail,x,j:longint;
begin
fillchar(dis,sizeof(dis),);
head:=;tail:=;opt[]:=s;dis[s]:=;
while head<>tail do
begin
head:=(head+)mod maxn;
x:=opt[head];j:=link[x];
while j<> do
begin
if (dis[x]+<dis[fa[j]])and(w[j]>) then
begin
dis[fa[j]]:=dis[x]+;
tail:=(tail+) mod maxn;opt[tail]:=fa[j];
end;
j:=next[j];
end;
end;
if dis[t]<>dis[-] then exit(true) else exit(false);
end; function dfs(p,sum:longint):longint;
var j,tem,x:longint;
begin
tem:=;
if p=t then exit(sum);
j:=link[p];
while j<> do
begin
if (dis[fa[j]]=dis[p]+)and(w[j]>) then
begin
x:=dfs(fa[j],min(sum-tem,w[j]));
inc(tem,x);dec(w[j],x);inc(w[rec[j]],x);
if tem=sum then exit(sum);
end;
j:=next[j];
end;
exit(tem);
end; function check:boolean;
var i,k:longint;
begin
j:=;s:=;t:=n+;ans:=;
fillchar(c,sizeof(c),);
for i:= to n do if odd(abs(a[i]-b[i])) then exit(false);
for i:= to m do if e[i].z= then inc(c[e[i].x,e[i].y]);
for i:= to n do if a[i]-b[i]> then
begin
add(s,i,(a[i]-b[i]) >> );
inc(ans,(a[i]-b[i]) >> );
end
else
if b[i]-a[i]> then add(i,t,(b[i]-a[i]) >> );
for i:= to n do
for k:= to n do if c[i,k]> then add(i,k,c[i,k]);
while (spfa)and(ans>) do
dec(ans,dfs(s,ans));
if ans= then exit(true) else exit(false);
end; begin
readln(test);
for tt:= to test do
begin
readln(n,m);
fillchar(link,sizeof(link),);
fillchar(next,sizeof(next),);
for i:= to n do
begin
a[i]:=;b[i]:=;
end;
for i:= to m do
begin
readln(e[i].x,e[i].y,e[i].z);
inc(a[e[i].x]);inc(b[e[i].y]);
end;
if check then writeln('possible') else writeln('impossible');
end;
end.
[POJ1637]混合图的欧拉回路判定|网络流的更多相关文章
- ACM/ICPC 之 混合图的欧拉回路判定-网络流(POJ1637)
//网络流判定混合图欧拉回路 //通过网络流使得各点的出入度相同则possible,否则impossible //残留网络的权值为可改变方向的次数,即n个双向边则有n次 //Time:157Ms Me ...
- POJ 1637 混合图的欧拉回路判定
题意:一张混合图,判断是否存在欧拉回路. 分析参考: 混合图(既有有向边又有无向边的图)中欧拉环.欧拉路径的判定需要借助网络流! (1)欧拉环的判定:一开始当然是判断原图的基图是否连通,若不连通则一定 ...
- 算法复习——欧拉回路混合图(bzoj2095二分+网络流)
题目: Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到另外任意一个小岛.现在YYD想骑单车 ...
- bzoj2095: [Poi2010]Bridges(二分+混合图求欧拉回路)
传送门 这篇题解讲的真吼->这里 首先我们可以二分一个答案,然后把所有权值小于这个答案的都加入图中 那么问题就转化为一张混合图(既有有向边又有无向边)中是否存在欧拉回路 首先 无向图存在欧拉回路 ...
- 紫书 例题 11-13 UVa 10735(混合图的欧拉回路)(最大流)
这道题写了两个多小时-- 首先讲一下怎么建模 我们的目的是让所有点的出度等于入度 那么我们可以把点分为两部分, 一部分出度大于入度, 一部分入度大于出度 那么显然, 按照书里的思路,将边方向后,就相当 ...
- POJ1637:Sightseeing tour(混合图的欧拉回路)
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10581 Accepted: 4466 ...
- POJ 1637 Sightseeing tour (混合图欧拉路判定)
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6986 Accepted: 2901 ...
- UVa 10735 (混合图的欧拉回路) Euler Circuit
题意: 给出一个图,有的边是有向边,有的是无向边.试找出一条欧拉回路. 分析: 按照往常的思维,遇到混合图,我们一般会把无向边拆成两条方向相反的有向边. 但是在这里却行不通了,因为拆成两条有向边的话, ...
- UVA 10735 Euler Circuit 混合图的欧拉回路(最大流,fluery算法)
题意:给一个图,图中有部分是向边,部分是无向边,要求判断是否存在欧拉回路,若存在,输出路径. 分析:欧拉回路的定义是,从某个点出发,每条边经过一次之后恰好回到出发点. 无向边同样只能走一次,只是不限制 ...
随机推荐
- Java工程师笔试题整理[校招篇]
Java工程师笔试题整理[校招篇] 隔着两个月即将开始校招了.你是不是也想借着这个机会崭露头角,拿到某些大厂的offer,赢取白富美.走上人生巅峰?当然如果你还没能打下Java基础,一定要先打 ...
- 一次和别人争吵一个按钮,点击后显示导航;再点击不显示的效果,是否一定以及必须用js?
事情经过是这样的,我们组一个说话很喜欢用一定,肯定的哥们,吃午饭的时候拿了自己做的一个UI库,头部有一个按钮 点击展开,再次点击收缩,他意思说一个按钮无法记录点击状态,必须使用js.然后我看了一眼,心 ...
- jmeter使用beanshell构造参数化
1.先在本地写一个java类,用来随机生成一个数字,如: package com.jmeter.test; public class BeanShellTest { public int getRan ...
- Python学习笔记(二)一一一字典总结
创建方式:1 直接创建 newDictonary={‘key’:'value',} 2 列表转字典(dict函数) 3 基本操作:len 返回总数 dictionary[k] 返回k对应的值 ...
- 利用selenium自动化登录淘宝
#encoding=utf-8 from selenium import webdriver from selenium.webdriver.common.action_chains import A ...
- spring-boot分页插件
1.分页插件,spring-boot.,第一次调用时,存值到 model.addAttribute("status", id);页面获取2.页面获取 后台存入的值,放在input ...
- 【Linux运维】Centos7上借助ansible搭建LVS+Keepalived
安装ansible 安装ansible: [root@localhost ~]# /etc/hosts 192.168.19.129 web129.yanglt.com web129 192.168. ...
- [POJ3585]Accumulation Degree
题面 \(\text{Solution:}\) 有些题目不仅让我们做树型 \(\text{dp}\) ,而且还让我们换每个根分别做一次, 然后这样就愉快的 \(\text{TLE}\) 了,所以我们要 ...
- 目标检测之Faster-RCNN的pytorch代码详解(模型准备篇)
十月一的假期转眼就结束了,这个假期带女朋友到处玩了玩,虽然经济仿佛要陷入危机,不过没关系,要是吃不上饭就看书,吃精神粮食也不错,哈哈!开个玩笑,是要收收心好好干活了,继续写Faster-RCNN的代码 ...
- python json模块 超级详解
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.JSON的数据格式其实就是python里面的字典格式,里面可以包含方括号括起来的数组,也 ...