poj1637
混合图欧拉回路
首先先明确基本概念
连通的无向图存在欧拉回路当且仅当不存在奇点
连通的有向图当且仅当每个点入度=出度
这道题我们显然应该当作连通的有向图来做
这个问题的困难之处在于我不知道应该从无向边的什么方向来走
那我们先假定一个走向,然后就变成了一个完全意义上的有向图,然后我们在进行调整
假定完方向后,我们就算出每个点的入度出度,
假如我们调整了了一条无向边的方向,那么对于一个端点入度会+1或-1,出度会-1或+1
毫无疑问,假如一个点出度和入度和为奇数,那么我永远也无法调整得到这个点出度=入度
排除这个情况后,我们考虑将入度>出度的点和入度<出度的点化为两侧
谈到调整,不难想到最大流的增广路调整,而这题正是用最大流做
对于每条无向边(u,v),暂定方向为u-->v ,连边u-->v flow=1 (不用管原来的有向边)
对于入度小于出度的点,从源点连一条到它的边,权值为(out-in)/2;
出度小于入度的点,连一条它到汇点的权值为(in-out)/2 的边;
然后我们跑最大流,每次对无向边的调整都对应从源点流1个流量向汇点
最后我们只要判断源点到各个点是否满流即可,满流就是所有点出度都=入度
当与源点相连的点(出度>入度的点)都满流后,与汇点相连的点(出度<入度)一定也满流
因为不管怎么调整,图中总的入度肯定=总的出度
type node=record
next,point,flow:longint;
end; var edge:array[..] of node;
d,cur,p,pre,numh,h,cd,rd:array[..] of longint;
len,s,t,x,y,z,i,k,n,m:longint;
f:boolean; procedure add(x,y,z:longint);
begin
inc(len);
edge[len].point:=y;
edge[len].flow:=z;
edge[len].next:=p[x];
p[x]:=len;
end; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; function sap:longint;
var u,i,j,neck,q,tmp:longint;
begin
u:=;
sap:=;
fillchar(numh,sizeof(numh),);
fillchar(h,sizeof(h),);
numh[]:=t+;
for i:= to t do
cur[i]:=p[i];
neck:=;
while h[]<t+ do
begin
i:=cur[u];
d[u]:=neck;
while i<>- do
begin
j:=edge[i].point;
if (edge[i].flow>) and (h[u]=h[j]+) then
begin
cur[u]:=i;
pre[j]:=u;
u:=j;
neck:=min(edge[i].flow,neck);
if u=t then
begin
sap:=sap+neck;
while u<> do
begin
u:=pre[u];
j:=cur[u];
dec(edge[j].flow,neck);
inc(edge[j xor ].flow,neck);
end;
neck:=;
end;
break;
end;
i:=edge[i].next;
end;
if i=- then
begin
dec(numh[h[u]]);
if numh[h[u]]= then exit;
i:=p[u];
q:=-;
tmp:=t;
while i<>- do
begin
j:=edge[i].point;
if edge[i].flow> then
if h[j]<tmp then
begin
tmp:=h[j];
q:=i;
end;
i:=edge[i].next;
end;
h[u]:=tmp+;
cur[u]:=q;
inc(numh[h[u]]);
if u<> then
begin
u:=pre[u];
neck:=d[u];
end;
end;
end;
end; begin
readln(k);
while k> do
begin
dec(k);
readln(n,m);
fillchar(p,sizeof(p),);
fillchar(rd,sizeof(rd),);
fillchar(cd,sizeof(cd),);
len:=-;
for i:= to m do
begin
readln(x,y,z);
if x=y then continue;
inc(cd[x]);
inc(rd[y]);
if z= then
begin
add(x,y,);
add(y,x,);
end;
end;
t:=n+;
f:=false;
s:=;
for i:= to n do
begin
if (cd[i]+rd[i]) mod = then
begin
f:=true;
break;
end;
z:=cd[i]-rd[i];
if z> then
begin
add(,i,z div );
add(i,,);
s:=s+z div ;
end
else begin
add(i,t,-z div );
add(t,i,);
end;
end;
if f then
begin
writeln('impossible');
continue;
end;
if sap=s then writeln('possible') else writeln('impossible');
end;
end.
poj1637的更多相关文章
- [POJ1637]混合图的欧拉回路判定|网络流
混合图的欧拉回路判定 上一篇正好分别讲了有向图和无向图的欧拉回路判定方法 如果遇上了混合图要怎么做呢? 首先我们思考有向图的判定方法:所有点的出度=入度 我们可以先为无向边任意定一个向,算出此时所有顶 ...
- ACM/ICPC 之 混合图的欧拉回路判定-网络流(POJ1637)
//网络流判定混合图欧拉回路 //通过网络流使得各点的出入度相同则possible,否则impossible //残留网络的权值为可改变方向的次数,即n个双向边则有n次 //Time:157Ms Me ...
- poj1637 Sightseeing tour
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8859 Accepted: 3728 ...
- POJ1637 Sightseeing tour(判定混合图欧拉回路)
有向连通图存在欧拉回路的充要条件是所有点入度=出度. 首先随便给定所有无向边一个方向(不妨直接是u->v方向),记录所有点的度(记:度=入度-出度). 这时如果有点的度不等于0,那么就不存在欧拉 ...
- POJ1637 Sightseeing tour (混合图欧拉回路)(网络流)
Sightseeing tour Time Limit: 1000MS Me ...
- poj1637 Sightseeing tour 混合图欧拉回路判定
传送门 第一次做这种题, 尽管ac了但是完全不知道为什么这么做. 题目就是给一些边, 有向边与无向边混合, 问你是否存在欧拉回路. 做法是先对每个点求入度和出度, 如果一条边是无向边, 就随便指定一个 ...
- poj1637 Sightseeing tour(混合图欧拉回路)
题目链接 题意 给出一个混合图(有无向边,也有有向边),问能否通过确定无向边的方向,使得该图形成欧拉回路. 思路 这是一道混合图欧拉回路的模板题. 一张图要满足有欧拉回路,必须满足每个点的度数为偶数. ...
- POJ1637:Sightseeing tour(混合图的欧拉回路)
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10581 Accepted: 4466 ...
- poj1637 Sightseeing tour[最大流+欧拉回路]
混合图的欧拉回路定向问题. 顺便瞎说几句,有向图定欧拉回路的充要条件是每个点入度等于出度,并且图联通.无向图的话只要联通无奇点即可. 欧拉路径的确定应该是无向图联通且奇点数0个或2个,有向图忘了,好像 ...
随机推荐
- Maven浅析-2 什么是Maven
1.简单点讲:Maven就是一个项目构建工具.它可以生成一个artifact(component),还可以帮我们管理项目依赖(如附加的组件Filters等). 2.从整体讲:Maven也可以看作一个项 ...
- HTML5本地化应用开发-HTML5 Web存储详解
文章不是简单的的Ctrl C与V,而是一个字一个标点符号慢慢写出来的.我认为这才是是对读者的负责,本教程由技术爱好者成笑笑(博客:http://www.chengxiaoxiao.com/)写作完成. ...
- phpstrtotime()对于31日求上个月有问题
PHP自带的strtotime()对于31日求上个月有问题,如下: <?php $date = "2012-07-31"; $date_unix = strtotime($d ...
- webrtc学习———记录三:mediaStreamTrack
参考: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack 转自http://c.tieba.baidu.com/p/3 ...
- 详解android:scaleType属性
详解android:scaleType属性 转自:http://blog.csdn.net/encienqi/article/details/7913262 http://juliaailse. ...
- SQL SERVER排序函数
排名函数是SQL Server2005新加的功能.在SQL Server2005中有如下四个排名函数: 1.row_number 2.rank 3.dense_rank 4.ntile 下面分别介绍一 ...
- 吐槽:Lambda表达式
前面我曾经讨论过Lambda表达式(也就是匿名表达式)的用法, 这里我就主要强调一下匿名表达式的好处. 首先是不需要写多余的方法体,特别是订阅事件的时候,但是也有一个问题,那就是单个方法会因为匿名表达 ...
- 最小生成树之 prim算法和kruskal算法(以 hdu 1863为例)
最小生成树的性质 MST性质:设G = (V,E)是连通带权图,U是V的真子集.如果(u,v)∈E,且u∈U,v∈V-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最 ...
- C++ 类访问控制(public/protected/private)
第一:private, public, protected 访问标号的访问范围. private:只能由1.该类中的函数.2.其友元函数访问. 不能被任何其他访问,该类的对象也不能访问. protec ...
- struts.xml文件示范
<?xml version="1.0" encoding="GBK"?> <!--下面指定Struts2配置文件的DTD信息--> &l ...