[POJ1637]Sightseeing tour:混合图欧拉回路
分析
混合图欧拉回路问题。
一个有向图有欧拉回路当且仅当图连通并且对于每个点,入度\(=\)出度。
入度和出度相等可以联想到(我也不知道是怎么联想到的)网络流除了源汇点均满足入流\(=\)出流。于是可以考虑先将无向边随意定向后,通过网络流来调整无向边的方向以达到每个点的入度和出度相等的目的。
建图方法如下:
- 若\(outdeg[x]>indeg[x]\),则从\(S\)向\(x\)连一条容量为\(\frac{outdeg[x]-indeg[x]}{2}\)的边。 
- 若\(outdeg[x]<indeg[x]\),则从\(x\)向\(T\)连一条容量为\(\frac{indeg[x]-outdeg[x]}{2}\)的边。 
- 将每一条你定向的有向边令其容量为\(1\)加入到网络中。 
这样一条增广路的意义就是将路径上的边全部取反,然后将第一个结点的入度\(++\),出度\(--\),将最后一个结点的入度\(--\),出度\(++\)。
怎么判无解?
把所有边都看作无向边,那么如果存在一个节点的度数为奇数,直接输出impossible即可。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <queue>
#define rin(i,a,b) for(register int i=(a);i<=(b);i++)
#define rec(i,a,b) for(int i=(a);i>=(b);i--)
#define trav(i,a) for(int i=head[x];i;i=e[i].nxt)
typedef long long LL;
using std::cin;
using std::cout;
using std::endl;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
	return x*f;
}
const int MAXN=205;
const int MAXM=1005;
int n,m,S,T,maxflow,ecnt,head[MAXN];
int indeg[MAXN],outdeg[MAXN],dep[MAXN],cur[MAXN];
std::queue<int> q;
struct Edge{
	int to,nxt,cap;
}e[MAXM*2+MAXN*2];
inline void add_edge(int bg,int ed,int ca){
	ecnt++;
	e[ecnt].to=ed;
	e[ecnt].nxt=head[bg];
	e[ecnt].cap=ca;
	head[bg]=ecnt;
}
inline bool bfs(){
	memset(dep,0,sizeof dep);
	rin(i,1,T) cur[i]=head[i];
	while(!q.empty()) q.pop();
	q.push(S);
	dep[S]=1;
	while(!q.empty()){
		int x=q.front();q.pop();
		trav(i,x){
			int ver=e[i].to;
			if(dep[ver]||!e[i].cap) continue;
			dep[ver]=dep[x]+1;
			q.push(ver);
		}
	}
	return dep[T]>0;
}
int dfs(int x,int pref){
	if(x==T||!pref) return pref;
	int flow=0,temp;
	for(int &i=cur[x];i;i=e[i].nxt){
		int ver=e[i].to;
		if(dep[ver]==dep[x]+1&&(temp=dfs(ver,std::min(pref,e[i].cap)))){
			e[i].cap-=temp;
			e[i^1].cap+=temp;
			flow+=temp;
			pref-=temp;
			if(!pref) return flow;
		}
	}
	return flow;
}
inline void dinic(){
	while(bfs()) maxflow+=dfs(S,1e9);
}
int main(){
	int TT=read();
	while(TT--){
		ecnt=1;memset(head,0,sizeof head);
		memset(indeg,0,sizeof indeg);
		memset(outdeg,0,sizeof outdeg);
		maxflow=0;
		n=read(),m=read();S=n+1,T=S+1;
		rin(i,1,m){
			int u=read(),v=read(),typ=read();
			if(!typ){
				add_edge(u,v,1);
				add_edge(v,u,0);
				outdeg[u]++;
				indeg[v]++;
			}
			else{
				outdeg[u]++;
				indeg[v]++;
			}
		}
		bool flag=0;
		rin(i,1,n){
			flag|=((outdeg[i]+indeg[i])&1);
		}
		if(flag){
			printf("impossible\n");
			continue;
		}
		int temp=0;
		rin(i,1,n){
			if(outdeg[i]>indeg[i]){
				add_edge(S,i,(outdeg[i]-indeg[i])/2);
				add_edge(i,S,0);
				temp+=(outdeg[i]-indeg[i])/2;
			}
			else if(outdeg[i]<indeg[i]){
				add_edge(i,T,(indeg[i]-outdeg[i])/2);
				add_edge(T,i,0);
			}
		}
		dinic();
		if(maxflow<temp) printf("impossible\n");
		else printf("possible\n");
	}
	return 0;
}
[POJ1637]Sightseeing tour:混合图欧拉回路的更多相关文章
- poj1637 Sightseeing tour(混合图欧拉回路)
		题目链接 题意 给出一个混合图(有无向边,也有有向边),问能否通过确定无向边的方向,使得该图形成欧拉回路. 思路 这是一道混合图欧拉回路的模板题. 一张图要满足有欧拉回路,必须满足每个点的度数为偶数. ... 
- POJ1637 Sightseeing tour (混合图欧拉回路)(网络流)
		Sightseeing tour Time Limit: 1000MS Me ... 
- poj1637  Sightseeing tour  混合图欧拉回路判定
		传送门 第一次做这种题, 尽管ac了但是完全不知道为什么这么做. 题目就是给一些边, 有向边与无向边混合, 问你是否存在欧拉回路. 做法是先对每个点求入度和出度, 如果一条边是无向边, 就随便指定一个 ... 
- POJ 1637 Sightseeing tour ★混合图欧拉回路
		[题目大意]混合图欧拉回路(1 <= N <= 200, 1 <= M <= 1000) [建模方法] 把该图的无向边随便定向,计算每个点的入度和出度.如果有某个点出入度之差为 ... 
- POJ1637:Sightseeing tour(混合图的欧拉回路)
		Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10581 Accepted: 4466 ... 
- poj 1637 Sightseeing tour 混合图欧拉回路 最大流 建图
		题目链接 题意 给定一个混合图,里面既有有向边也有无向边.问该图中是否存在一条路径,经过每条边恰好一次. 思路 从欧拉回路说起 首先回顾有向图欧拉回路的充要条件:\(\forall v\in G, d ... 
- POJ 1637 Sightseeing tour (混合图欧拉回路)
		Sightseeing tour Description The city executive board in Lund wants to construct a sightseeing tou ... 
- poj1637Sightseeing tour(混合图欧拉回路)
		题目请戳这里 题目大意:求混合图欧拉回路. 题目分析:最大流.竟然用网络流求混合图的欧拉回路,涨姿势了啊啊.. 其实仔细一想也是那么回事.欧拉回路是遍历所有边一次又回到起点的回路.双向图只要每个点度数 ... 
- poj1637 Sightseeing tour[最大流+欧拉回路]
		混合图的欧拉回路定向问题. 顺便瞎说几句,有向图定欧拉回路的充要条件是每个点入度等于出度,并且图联通.无向图的话只要联通无奇点即可. 欧拉路径的确定应该是无向图联通且奇点数0个或2个,有向图忘了,好像 ... 
- POJ 1637 Sightseeing tour(混合图的欧拉回路)
		题目链接 建个图,套个模板. #include <cstdio> #include <cstring> #include <iostream> #include & ... 
随机推荐
- Win10.Shift+鼠标右键_CMD(管理员)
			1.资料: 1.1.Windows10下设置Shift+右键增加cmd - wyx0712的博客 - CSDN博客.html(https://blog.csdn.net/wyx0712/article ... 
- JDK,JRE,JVM的区别与联系?
			概念区别 JDK: Java Develpment Kit java 开发工具JRE: Java Runtime Environment java运行时环境JVM: ... 
- Vim常用的功能命令
			一.编辑 查看行号 :set nu 删除一整行 dd 删除1到10行 :1,10d 删除所有内容 dG 当前行下插入一空行 o 撤销改动 u 查看当前行信息 ... 
- Scrapy输出文件格式问题汇总
			Q:Scrapy抓取的内容(包含中文)输出到JSON Lines文件时如何确保输出的是字符本身而不是其unicode编码? A:默认的JsonLinesItemExporter其ensure_asci ... 
- Tomcat原理剖析
			Tomcat原理学习 理解Tomcat工作原理 Tomcat的概念及启动原理浅析 Tomcat系统架构与设计模式 
- java8-----lambda语法
			// -----lambda语法1------ https://www.baidu.com/link?url=6iszXQlsmyaoWVZMaPs3g8vLRQXzdzTnKzQYTF8lg-5QQ ... 
- 小白学Python(19): Pyinstaller 生成 exe 文件
			python 默认并不包含 PyInstaller 模块,因此需要自行安装 PyInstaller 模块. 安装 PyInstaller 模块与安装其他 Python 模块一样,使用 pip 命令安装 ... 
- python3 pycurl 出现 TypeError: string argument expected, got 'bytes' 解决方案
			用pycurl请求指定链接并返回结果时出现 TypeError: string argument expected, got 'bytes' 错误 经过排查问题出现在使用StringIO的write ... 
- mongoose 数据库操作2
			mongoose的内置的主要功能解说 除了定义文档结构和你要存储的数据类型外.模式(Schema)还用于下面定义: · Validators (异步和同步) · Defa ... 
- Linux 解决E: Sub-process /usr/bin/dpkg returned an error code (1)错误
			在用apt-get安装软件时出现了类似于 install-info: No dir file specified; try --help for more information.dpkg: 处理 g ... 
