题目大意

求混合图是否存在欧拉回路

做法

有向边我们只有增加入度出度

对于无向边,我们给它设定一个初始方向

如果不能满足|入度-出度|为偶数,无解

然后在网络流图中,

设设定方向的反向连一条边,表示反悔流量

对于最后in>out的点,最多可以提供反悔(in-out)/2点反悔流量,从源点连向它

对于out>in的点,至少接受(out-in)/2点反悔流量,连向汇点

跑一次网络流判断是否满流

由于图中一条边提供一个入度,一个出度

所以图中总入度是等于总出度的

网络流中两边流量是一样的

注意

sb我还要错多少次

网络流连边的数组还要考虑到连源点汇点的边

数组开大一点会死咩

分析

#include <cstdio>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
using namespace std;
const int M=207;
const int S=0;
const int T=201;
const int INF=1e9; inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
} int tcas;
int n,m;
int in[M];
int ot[M];
int g[M],te;
struct edge{int y,f,next;}e[2407]; void addedge(int x,int y,int f){
e[++te].y=y;e[te].f=f;e[te].next=g[x];g[x]=te;
e[++te].y=x;e[te].f=0;e[te].next=g[y];g[y]=te;
} int q[M],tq;
int lev[M]; bool bfs(){
int h=0,t=1,x,p,y;
memset(lev,-1,sizeof(lev));
q[1]=S; lev[S]=0;
while(h^t){
int x=q[++h];
for(p=g[x];p;p=e[p].next)
if(e[p].f&&lev[y=e[p].y]==-1){
lev[y]=lev[x]+1;
if(y==T) return 1;
q[++t]=y;
}
}
return 0;
} int dfs(int x,int fl){
if(x==T) return fl;
int p,y;
int tp,res=0;
for(p=g[x];p;p=e[p].next)
if(e[p].f&&lev[x]+1==lev[y=e[p].y]){
tp=dfs(y,min(fl,e[p].f));
if(tp){
e[p].f-=tp;
e[p^1].f+=tp;
res+=tp;
fl-=tp;
if(fl==0) return res;
}
}
if(res==0) lev[x]=-1;
return res;
} int main(){
int i,x,y,z,res;
tcas=rd();
while(tcas--){
n=rd();
m=rd();
memset(in,0,sizeof(in));
memset(ot,0,sizeof(ot));
memset(g,0,sizeof(g)); te=1;
for(i=1;i<=m;i++){
x=rd(),y=rd(),z=rd();
ot[x]++;
in[y]++;
if(z==0) addedge(y,x,1);
} z=0;
for(i=1;i<=n;i++)
if((in[i]-ot[i])%2==1) {z=1;break;} if(z) puts("impossible");
else{
res=0;
for(i=1;i<=n;i++){
z=abs(in[i]-ot[i])/2;
if(!z) continue;
if(in[i]>ot[i]) addedge(S,i,z);
else addedge(i,T,z),res+=z;
}
while(bfs()) res-=dfs(S,INF);
if(res>0) puts("impossible");
else puts("possible");
}
}
return 0;
}

poj 1637 混合图欧拉回路 学习笔记的更多相关文章

  1. POJ 1637 混合图欧拉回路

    先来复习一下混合图欧拉回路:给定一张含有单向边和双向边的图,使得每一点的入度出度相同. 首先对于有向边来说,它能贡献的入度出度是确定的,我们不予考虑.对于无向图,它可以通过改变方向来改变两端点的出入度 ...

  2. POJ 1637 混合图的欧拉回路判定

    题意:一张混合图,判断是否存在欧拉回路. 分析参考: 混合图(既有有向边又有无向边的图)中欧拉环.欧拉路径的判定需要借助网络流! (1)欧拉环的判定:一开始当然是判断原图的基图是否连通,若不连通则一定 ...

  3. POJ 1637 混合图求欧拉回路 最大流实现

    前面讲过了无向图,有向图求欧拉回路,欧拉通路的做法.可以直接根据度数来判断,当然前提是这是一个连通图. 这道题既有无向边,又有有向边,然后求欧拉回路. 采用的方法是最大流. 具体处理方法. 首先,我们 ...

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

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

  5. POJ 1637 Sightseeing tour(混合图欧拉回路+最大流)

    http://poj.org/problem?id=1637 题意:给出n个点和m条边,这些边有些是单向边,有些是双向边,判断是否能构成欧拉回路. 思路: 构成有向图欧拉回路的要求是入度=出度,无向图 ...

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

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

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

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

  8. 【BZOJ-2095】Bridge 最大流 + 混合图欧拉回路 + 二分

    2095: [Poi2010]Bridges Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 604  Solved: 218[Submit][Stat ...

  9. poj1637Sightseeing tour(混合图欧拉回路)

    题目请戳这里 题目大意:求混合图欧拉回路. 题目分析:最大流.竟然用网络流求混合图的欧拉回路,涨姿势了啊啊.. 其实仔细一想也是那么回事.欧拉回路是遍历所有边一次又回到起点的回路.双向图只要每个点度数 ...

随机推荐

  1. Windows系统安装docker

    下载安装包 官网 点击 Get Started ,打开入门页面,往下拉,找到 Download for Windows 打开 下载页面 ,点击 Please Login To Download ,要注 ...

  2. 为什么方差的分母有时是n,有时是n-1 源于总体方差和样本方差的不同

    为什么样本方差(sample variance)的分母是 n-1? 样本方差计算公式里分母为n-1的目的是为了让方差的估计是无偏的.无偏的估计(unbiased estimator)比有偏估计(bia ...

  3. iOS 后台传输服务

    后台传输服务 — 我们用水壶来比喻 (0:14) 后天传输服务是 iOS 7 引进的 API,它准许应用暂停或者中止之后,在后台继续执行网络服务(比如下载或者上传).举个例子,这正是 Dropbox ...

  4. 20181111 计时器影响DOM点击事件的逻辑

    今天在群里看见一个人在问"点击按钮使图片产生旋转为什么要使用计时器来实现",我自己操作了一遍她的代码才发现里面的逻辑实现很有意思,所以写出来分享一下. 她的代码是这样写的: < ...

  5. verilog 1995 VS 2001 part1模块声明的扩展

    1.模块声明的扩展 (1)端口声明(input/output/inout)同数据类型声明(reg /wire)放在同一语句中. (2)ANSI C风格的端口声明可以用于module/task/func ...

  6. Python9-进程-day36

    import osfrom multiprocessing import Processimport timedef func(args,args2): print(args,args2) time. ...

  7. nrf51822微信开发入门学习笔记1:开始前的准备

    参考:(id:love--baby)https://blog.csdn.net/hunhun1122/article/details/68922493 微信硬件平台:https://iot.weixi ...

  8. cmake命令 安装、用法简介

    前言 cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中所产生的衍生品.后来经过发展,最终形成体系,在2001年成为一个独立的开放源代码项目.其官方网站是www.cm ...

  9. 【HIHOCODER 1181】欧拉路·二

    描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角继续往前走,面前出现了一座石桥,石桥的尽头有一道火焰墙,似乎无法通过. 小Hi注意到在桥头有一张 ...

  10. poj1523赤裸裸的割点

    这题真是没什么好说的...赤裸裸的求割点直接模板上 #include<cstdio> #include<cstring> #include<iostream> #i ...