混合图欧拉回路
首先先明确基本概念
连通的无向图存在欧拉回路当且仅当不存在奇点
连通的有向图当且仅当每个点入度=出度
这道题我们显然应该当作连通的有向图来做
这个问题的困难之处在于我不知道应该从无向边的什么方向来走
那我们先假定一个走向,然后就变成了一个完全意义上的有向图,然后我们在进行调整
假定完方向后,我们就算出每个点的入度出度,
假如我们调整了了一条无向边的方向,那么对于一个端点入度会+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的更多相关文章

  1. [POJ1637]混合图的欧拉回路判定|网络流

    混合图的欧拉回路判定 上一篇正好分别讲了有向图和无向图的欧拉回路判定方法 如果遇上了混合图要怎么做呢? 首先我们思考有向图的判定方法:所有点的出度=入度 我们可以先为无向边任意定一个向,算出此时所有顶 ...

  2. ACM/ICPC 之 混合图的欧拉回路判定-网络流(POJ1637)

    //网络流判定混合图欧拉回路 //通过网络流使得各点的出入度相同则possible,否则impossible //残留网络的权值为可改变方向的次数,即n个双向边则有n次 //Time:157Ms Me ...

  3. poj1637 Sightseeing tour

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8859   Accepted: 3728 ...

  4. POJ1637 Sightseeing tour(判定混合图欧拉回路)

    有向连通图存在欧拉回路的充要条件是所有点入度=出度. 首先随便给定所有无向边一个方向(不妨直接是u->v方向),记录所有点的度(记:度=入度-出度). 这时如果有点的度不等于0,那么就不存在欧拉 ...

  5. POJ1637 Sightseeing tour (混合图欧拉回路)(网络流)

                                                                Sightseeing tour Time Limit: 1000MS   Me ...

  6. poj1637 Sightseeing tour 混合图欧拉回路判定

    传送门 第一次做这种题, 尽管ac了但是完全不知道为什么这么做. 题目就是给一些边, 有向边与无向边混合, 问你是否存在欧拉回路. 做法是先对每个点求入度和出度, 如果一条边是无向边, 就随便指定一个 ...

  7. poj1637 Sightseeing tour(混合图欧拉回路)

    题目链接 题意 给出一个混合图(有无向边,也有有向边),问能否通过确定无向边的方向,使得该图形成欧拉回路. 思路 这是一道混合图欧拉回路的模板题. 一张图要满足有欧拉回路,必须满足每个点的度数为偶数. ...

  8. POJ1637:Sightseeing tour(混合图的欧拉回路)

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10581   Accepted: 4466 ...

  9. poj1637 Sightseeing tour[最大流+欧拉回路]

    混合图的欧拉回路定向问题. 顺便瞎说几句,有向图定欧拉回路的充要条件是每个点入度等于出度,并且图联通.无向图的话只要联通无奇点即可. 欧拉路径的确定应该是无向图联通且奇点数0个或2个,有向图忘了,好像 ...

随机推荐

  1. dhcp源码编译支持4G上网卡

    1. tar xvzf dhcp-4.2.5-P1.tar.gz 2. ./configure --host=arm-linux ac_cv_file__dev_random=yes 3. vi bi ...

  2. Entity Framework Demo(一) 简单搭建环境

    Entity Framwork(实体框架,简称EF)是ORM(Object Relational Mapping,对象映射关系)的一个解决方案. EF允许项目将数据库的表映射为实体,并封装了操作方法, ...

  3. WEB 开发工具分享

    有好用的工具 : 云盘链接地址:

  4. Java重写和重载的区别

    区别点 重载方法 重写方法 参数列表 必须修改 一定不能修改 返回类型 可以修改 一定不能修改 异常 可以修改 可以减少或删除,一定不能抛出新的或者更广的异常 访问 可以修改 一定不能做更严格的限制( ...

  5. Java-hibernate的Hello World

     hibernate 是对jdbc进行轻量级封装的  orm 框架,充当项目的持久层. 要使用 hibernate首先就需要继续配置, 引包:下载hibernate然后加入jar包 同时引入mysql ...

  6. iOS消息推送机制

    iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务 ...

  7. DependencyProperty

    <Window x:Class="DependencyPropertyDemo.MainWindow" xmlns="http://schemas.microsof ...

  8. 『重构--改善既有代码的设计』读书笔记----Change Value to Reference

    有时候你会认为某个对象应该是去全局唯一的,这就是引用(Reference)的概念.它代表当你在某个地点对他进行修改之后,那么所有共享他的对象都应该在再次访问他的时候得到相应的修改.而不会像值对象(Va ...

  9. demo_02 less

    html 中的代码<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> &l ...

  10. 汤姆大叔的6道js题目

    汤姆大叔的6道javascript编程题题解 看汤姆大叔的博文,其中有篇(猛戳这里)的最后有6道编程题,于是我也试试,大家都可以先试试. 1.找出数字数组中最大的元素(使用Math.max函数) 1 ...