POJ 1637 Sightseeing tour 建图+网络流
题意:
给定一个混合图,所谓混合图就是图中既有单向边也有双向边,现在求这样的图是否存在欧拉回路。
分析:
存在欧拉回路的有向图,必须满足[入度==出度],现在,有些边已经被定向,所以我们直接记录度数即可,对于无向边呢?
对于这样的边,我们只需要先随便定向,然后记录出入度。(这些边只用来计算出入度,不用于网络流建图)
然后我们开始建图。现在极有可能有些点是不满足[入度==出度]的,所以我们要通过一些变向操作,使得图中所有点满足判定。
如果一个点入度和出度的奇偶性不同,那整张图一定是不合法的。因为改变一条边的方向对端点的入度和出度是同时影响的,且是反向的,比如入度加一出度减一,或者出度加一入度减一,因此无论如何,那样的点都不可能满足判定条件的;
随后,我们对于:
所有入度>出度的点,从超级源点连一条容量为(入度-出度)/2的边;
所有出度>入度的点,向超级汇点连一条容量为(出度-入度)/2的边;
这样,一单位流量的需求,意味着有这么多边需要变向来使图满足判定条件。所以那些边可以变向,我们就使它的贡献为1 。
所以,对于我们曾随便定向的那些无向边,我们在网络流建图中,向它们相反方向建一条流量为1的边(与我们随便定的向相反)。
之后检验整张图与源点汇点连得边是否满流,满流则possible,不满则impossible。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;
const int inf=0x3f3f3f3f;
const int N=;
struct edge{int x,y,d;}w[N];
struct node{int y,z,nxt;}e[N*];
int in[N],ot[N],S,T,q[N],h[N],c=;
int n,m,sm=,tot=,d[N],k,cas,flg;
void add(int x,int y,int z){
e[++c]=(node){y,z,h[x]};h[x]=c;
e[++c]=(node){x,,h[y]};h[y]=c;
} bool bfs(){
int f=,t=;ms(d,-);
q[++t]=S;d[S]=;
while(f<=t){
int x=q[f++];
for(int i=h[x],y;i;i=e[i].nxt)
if(d[y=e[i].y]==-&&e[i].z)
d[y]=d[x]+,q[++t]=y;
} return (d[T]!=-);
} int dfs(int x,int f){
if(x==T) return f;int w,tmp=;
for(int i=h[x],y;i;i=e[i].nxt)
if(d[y=e[i].y]==d[x]+&&e[i].z){
w=dfs(y,min(e[i].z,f-tmp));
if(!w) d[y]=-;
e[i].z-=w;e[i^].z+=w;
tmp+=w;if(tmp==f) return f;
} return tmp;
} void dinic(){
while(bfs()) tot+=dfs(S,inf);
} int main(){
scanf("%d",&cas);while(cas--){
scanf("%d%d",&n,&m);flg=;
ms(in,);ms(ot,);ms(h,);
c=;S=,T=n+;sm=,tot=;
for(int i=;i<=m;i++)
scanf("%d%d%d",&w[i].x,&w[i].y,&w[i].d),
in[w[i].y]++,ot[w[i].x]++;
for(int i=;i<=n;i++){
if((in[i]&)^(ot[i]&))
{flg=;break;}
if(in[i]>ot[i]) //sm+=in[i]-ot[i],
add(S,i,(in[i]-ot[i])/);
if(in[i]<ot[i]) sm+=ot[i]-in[i],
add(i,T,(ot[i]-in[i])/);
} if(flg){puts("impossible");continue;}
for(int i=;i<=m;i++)
if(!w[i].d) add(w[i].y,w[i].x,);
dinic();sm>>=;
if(tot==sm) puts("possible");
else puts("impossible");
} return ;
}
最大流
POJ 1637 Sightseeing tour 建图+网络流的更多相关文章
- 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 ...
- POJ 1637 Sightseeing tour ★混合图欧拉回路
[题目大意]混合图欧拉回路(1 <= N <= 200, 1 <= M <= 1000) [建模方法] 把该图的无向边随便定向,计算每个点的入度和出度.如果有某个点出入度之差为 ...
- POJ 1637 Sightseeing tour(混合图的欧拉回路)
题目链接 建个图,套个模板. #include <cstdio> #include <cstring> #include <iostream> #include & ...
- POJ 1637 Sightseeing tour(最大流)
POJ 1637 Sightseeing tour 题目链接 题意:给一些有向边一些无向边,问能否把无向边定向之后确定一个欧拉回路 思路:这题的模型很的巧妙,转一个http://blog.csdn.n ...
- POJ 1637 Sightseeing tour (混合图欧拉路判定)
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6986 Accepted: 2901 ...
- POJ 1637 - Sightseeing tour - [最大流解决混合图欧拉回路]
嗯,这是我上一篇文章说的那本宝典的第二题,我只想说,真TM是本宝典……做的我又痛苦又激动……(我感觉ACM的日常尽在这张表情中了) 题目链接:http://poj.org/problem?id=163 ...
- 网络流(最大流) POJ 1637 Sightseeing tour
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8628 Accepted: 3636 ...
- POJ 1637 Sightseeing tour (SAP | Dinic 混合欧拉图的判断)
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6448 Accepted: 2654 ...
随机推荐
- Ubuntu 12.04的gnome classic panel添加程序快捷键(转载)
How to add applets to the Gnome classic panel in Ubuntu 12.04 转自:http://www.borfast.com/blog/how-add ...
- bzoj 3308: 九月的咖啡店【最大费用最大流】
费用流里spfa最后的判断要写成dis[t]>=0而不是dis[t]!=-inf否则会WAWAWA-- #include<iostream> #include<cstdio&g ...
- CCF2016.4 - B题
思路:创建两个bool数组来模拟下落过程,一个存放面板状态,一个存放下落的格子.检测格子和面板对应位置是否同时为True,如果是则有冲突,不能继续下落,否则增加行号.为了统一处理,我们把面板最下面加一 ...
- 在xampp集成环境下使用 thinkphp 连接oracle
今天搞了大半天,终于成功了. 1. 首先需要让xampp支持oracle,直接按这个网页上说的做就行.http://nimal.info/blog/2009/activate-oracle-on-xa ...
- Qt事件系统之四:定时器事件与随机数
一.定时器事件和随机数 QTimerEvent类用来描述一个定时器事件.对于一个QObject的子类,只需要使用int QObject::startTimer ( int interval)函数来开启 ...
- Ubuntu 必装软件及安装教程
安装搜狗拼音输入法 因为sogou是基于fcitx的,所以先添加fcitx键盘输入法系统[系统默认是iBus].在终端中,输入命令将下载源添加至系统源(添加依赖). sudo add-apt-repo ...
- [UOJ388]配对树
题解 贪心+线段树 首先如果我们知道了哪些点是关键点应该怎么搞 显然最小的匹配方案所有的边至多被经过一次 可以考虑每条边的贡献 因为我们要贡献尽量小 所以我们尽量让每条边经过的人尽量少 那么每条边被经 ...
- [POI2007]旅游景点atr
Description FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之 ...
- HDU 1524
思路: 算出来每个点的sg值,然后对于每个询问xor一下 //By SiriusRen #include <cstdio> #include <vector> using na ...
- ArrayList、HashMap 与 员工类(程序员、经理的结合使用) 相当于集合与继承的总结
package Day28ketangzuoye; import java.util.ArrayList; import java.util.HashMap; import java.util.Map ...