题目请戳这里

题目大意:求混合图欧拉回路。

题目分析:最大流。竟然用网络流求混合图的欧拉回路,涨姿势了啊啊。。

其实仔细一想也是那么回事。欧拉回路是遍历所有边一次又回到起点的回路。双向图只要每个点度数为偶数即可,有向图要保证所有点入度等于出度。求路径的话,dfs即可。

混合图的话,就比较复杂。首先将有向边定向,求出所有点的入度和出度,如果某个点入度和出度之差为奇数,则一定不存在欧拉回路,因为对于混合图,无向边可以任意指定方向,但是无论指定哪个方向,如果取反向的话,只会影响端点的一个出度和一个入度,所以无论无向边如何定向,是不影响节点入度和出度之差的奇偶性的。无向边定向后转化成一张有向图,那么所有的顶点就分成3类:

1:入度= 出度的点,已经是平衡点了,不管;

2:入度>出度的点,向汇点建一条边,边权为(入度- 出度)/2;

3:入度<出度的点,源点与之建一条边,边权为(出度- 入度)/2;

这样跑一遍最大流,看是否为满流。如果是满流,就存在欧拉回路。

因为如果跑出来一个满流,那么对于每个入度>出度的点,都有x条边进来,那么这x条边反向,那么该节点入度=出度,平衡了,对于每个出度>入度的点也是同理。对于出度=入度的点,因为建图的时候没有管他们,也就是说他们本来就是平衡点,所以源点和汇点与之没有直接边,但并不代表这些点就不在图中,因为非平衡点会与之有边相连。如果要求一条具体的欧拉回路的话,只要看具体的网络流,对于流量为1的边,取反便是欧拉回路中一条边了。所谓取反只是对无向边而言的,说明一开始对无向边定向定反了。

详情请见代码:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 205;
const int M = 40000;
const int inf = 0x3f3f3f3f; int n,m,num,sum;
int head[N],sta[N],que[N],cnt[N],dis[N],rpath[N];
int in[N],out[N];
struct node
{
int to,c,next,pre;
}arc[M];
void build(int s,int e,int cap)
{
arc[num].to = e;
arc[num].c = cap;
arc[num].next = head[s];
head[s] = num ++;
arc[num - 1].pre = num;
arc[num].pre = num - 1;
arc[num].to = s;
arc[num].c = 0;
arc[num].next = head[e];
head[e] = num ++;
}
void init()
{
int i,a,b,d;
scanf("%d%d",&n,&m);
for(i = 1;i <= n;i ++)
in[i] = out[i] = 0;
memset(head,-1,sizeof(head));
num = 0;
while(m --)
{
scanf("%d%d%d",&a,&b,&d);
if(d == 0)
build(a,b,1);
out[a] ++;
in[b] ++;
}
}
void re_Bfs()
{
int i,front,rear;
for(i = 0;i <= n + 1;i ++)
{
dis[i] = n + 2;
cnt[i] = 0;
}
dis[n + 1] = 0;
cnt[0] = 1;
front = rear = 0;
que[rear ++] = n + 1;
while(front != rear)
{
int u = que[front ++];
for(i = head[u];i != -1;i = arc[i].next)
{
if(arc[arc[i].pre].c == 0 || dis[arc[i].to] < n + 2)
continue;
dis[arc[i].to] = dis[u] + 1;
cnt[dis[arc[i].to]] ++;
que[rear ++] = arc[i].to;
}
}
}
int ISAP()
{
re_Bfs();
int i,u,maxflow = 0;
for(i = 0;i <= n + 1;i ++)
sta[i] = head[i];
u = 0;
while(dis[0] < n + 2)
{
if(u == n + 1)
{
int curflow = inf;
for(i = 0;i != n + 1;i = arc[sta[i]].to)
curflow = min(curflow,arc[sta[i]].c);
for(i = 0;i != n + 1;i = arc[sta[i]].to)
{
arc[sta[i]].c -= curflow;
arc[arc[sta[i]].pre].c += curflow;
}
maxflow += curflow;
u = 0;
}
for(i = sta[u];i != -1;i = arc[i].next)
if(arc[i].c > 0 && dis[arc[i].to] + 1 == dis[u])
break;
if(i != -1)
{
sta[u] = i;
rpath[arc[i].to] = arc[i].pre;
u = arc[i].to;
}
else
{
if((-- cnt[dis[u]]) == 0)
break;
int Min = n + 2;
sta[u] = head[u];
for(i = head[u];i != -1;i = arc[i].next)
if(arc[i].c > 0)
Min = min(Min,dis[arc[i].to]);
dis[u] = Min + 1;
cnt[dis[u]] ++;
if(u != 0)
u = arc[rpath[u]].to;
}
}
return maxflow;
}
bool solve()
{
int i;
sum = 0;
for(i = 1;i <= n;i ++)
{
if(in[i] > out[i])
{
if((in[i] - out[i])&1)
return false;
build(i,n + 1,(in[i] - out[i])>>1);
}
if(in[i] < out[i])
{
if((out[i] - in[i])&1)
return false;
build(0,i,(out[i] - in[i])>>1);
sum += (out[i] - in[i])>>1;
}
}
return ISAP() == sum;
}
int main()
{
int t;
scanf("%d",&t);
while(t --)
{
init();
if(solve())
puts("possible");
else
puts("impossible");
}
return 0;
}
//200K 0MS

poj1637Sightseeing tour(混合图欧拉回路)的更多相关文章

  1. POJ 1637 Sightseeing tour ★混合图欧拉回路

    [题目大意]混合图欧拉回路(1 <= N <= 200, 1 <= M <= 1000) [建模方法] 把该图的无向边随便定向,计算每个点的入度和出度.如果有某个点出入度之差为 ...

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

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

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

                                                                Sightseeing tour Time Limit: 1000MS   Me ...

  4. poj 1637 Sightseeing tour 混合图欧拉回路 最大流 建图

    题目链接 题意 给定一个混合图,里面既有有向边也有无向边.问该图中是否存在一条路径,经过每条边恰好一次. 思路 从欧拉回路说起 首先回顾有向图欧拉回路的充要条件:\(\forall v\in G, d ...

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

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

  6. POJ 1637 Sightseeing tour (混合图欧拉回路)

    Sightseeing tour   Description The city executive board in Lund wants to construct a sightseeing tou ...

  7. 混合图欧拉回路POJ1637Sightseeing tour

    http://www.cnblogs.com/looker_acm/archive/2010/08/15/1799919.html /* ** 混合图欧拉回路 ** 只记录各定点的出度与入度之差,有向 ...

  8. POJ 1637 - Sightseeing tour - [最大流解决混合图欧拉回路]

    嗯,这是我上一篇文章说的那本宝典的第二题,我只想说,真TM是本宝典……做的我又痛苦又激动……(我感觉ACM的日常尽在这张表情中了) 题目链接:http://poj.org/problem?id=163 ...

  9. Sightseeing tour 【混合图欧拉回路】

    题目链接:http://poj.org/problem?id=1637 Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total ...

随机推荐

  1. Latex命令笔记

    1.\documentclass[hyperref, UTF8]{ctexart} 2.\numberwithin{equation}{section} %article中让公式按章节名编号 3.\p ...

  2. MDX笔记

    为啥要写这一篇博客:之前断断续续的学习过MDX,也大致学会了基本语法,理解了基本用法,但是用的机会不多,到了真正用的时候,无从下手,十分尴尬!故此,将语法和基本用法温故总结,结合实例将MDX做个阶段性 ...

  3. javascript - 工作笔记 (事件绑定二)

    在上篇中的事件绑定方法,相信大家都看到过了. 不过这里有点小小的问题,这些方法,变量都是全局的,难免会与其他的库或者方法发生冲突而被覆盖,因此,我在这里做了小小的封装,如下:  JavaScript ...

  4. wifi相关协议

    IEEE 802.11Wi-Fi 协议摘要 协议 频率 信号 最大,数据率 传统802.11 2.4GHz FHSS或DSSS 2Mbps 802.11a 5GHz OFDM 54Mbps 802.1 ...

  5. 最近招两个兼职的活(PHP和JSP)

    我这里的活,都是兼职写作的,是两本入门教程, 一本是PHP+Nginx 一本是JSP+Servlet. 都是入门教程,有署名有稿酬,有兴趣的可以联系 QQ:837652732  验证:PHP或Java ...

  6. 柯南君:看大数据时代下的IT架构(8)消息队列之RabbitMQ--案例(topic起航)

    二.Topic(主题) (using the Java client) 上一篇文章中,我们进步改良了我们的日志系统.我们使用direct类型转发器,使得接收者有能力进行选择性的接收日志,,而非fano ...

  7. 详解Spring中的CharacterEncodingFilter--forceEncoding为true在java代码中设置失效--html设置编码无效

    在项目中有很多让人头疼的问题,其中,编码问题位列其一,那么在Spring框架中是如何解决从页面传来的字符串的编码问题的呢?下面我们来看看Spring框架给我们提供过滤器CharacterEncodin ...

  8. C++ - Vector 计算 均值(mean) 和 方差(variance)

    Vector 计算 均值(mean) 和 方差(variance) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24623187 ...

  9. OkHttp–支持SPDY协议的高效HTTP库

    Android为我们提供了两种HTTP交互的方式: HttpURLConnection 和 Apache HTTP Client,虽然两者都支持HTTPS,流的上传和下载,配置超时,IPv6和连接池, ...

  10. DataReader转泛型

    实体类的字段类型要和数据库一致,不然可能会出现错误. /// <summary> /// DataReader转泛型 /// </summary> /// <typepa ...