把该图的无向边随便定向,计算每个点的入度和出度。如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路。因为欧拉回路要求每点入度 = 出度,也就是总度数为偶数,存在奇数度点必不能有欧拉回路;

好了,现在每个点入度和出度之差均为偶数。那么将这个偶数除以2,得x。也就是说,对于每一个点,只要将x条边改变方向(入>出就是变入,出>入就是变出),就能保证出=入。如果每个点都是出=入,那么很明显,该图就存在欧拉回路。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int M=;
const int inf=0x3f3f3f3f;
inline int read(){
int sum=,x=;
char ch=getchar();
while(ch<''||ch>''){
if(ch=='-')
x=;
ch=getchar();
}
while(ch>=''&&ch<='')
sum=(sum<<)+(sum<<)+(ch^),ch=getchar();
return x?sum:-sum;
}
inline void write(int x){
if(x<)
putchar('-'),x=-x;
if(x>)
write(x/);
putchar(x%+'');
}
struct node{
int v,w,nextt;
}e[];
int deep[M],cur[M],head[M],du[M],tot,s,t;
bool bfs(){
for(int i=;i<=t;i++)
deep[i]=;
queue<int>que;
que.push(s);
deep[s]=;
while(!que.empty()){
int u=que.front();
que.pop();
for(int i=head[u];~i;i=e[i].nextt){
int v=e[i].v;
if(e[i].w>&&deep[v]==){
deep[v]=deep[u]+;
if(v==t){
return true;
}
que.push(v);
}
}
}
return deep[t]==?false:true;
}
int dfs(int u,int fl){
if(u==t){
return fl;
}
int x,ans=;
for(int i=cur[u];~i;i=e[i].nextt){
int v=e[i].v;
if(e[i].w>&&deep[v]==deep[u]+){
x=dfs(v,min(fl-ans,e[i].w));
e[i].w-=x;
e[i^].w+=x;
if(e[i].w)
cur[u]=i;
ans+=x;
if(ans==fl)
return ans;
}
}
if(ans==)
deep[u]=;
return ans;
}
int dinic(){
int ans=;
while(bfs()){
//cout<<ans<<endl;
for(int i=;i<=t;i++)
cur[i]=head[i];
ans+=dfs(s,inf);
}
return ans;
}
void addedge(int u,int v,int w){
e[tot].v=v;
e[tot].w=w;
e[tot].nextt=head[u];
head[u]=tot++;
e[tot].v=u;
e[tot].w=;
e[tot].nextt=head[v];
head[v]=tot++;
}
void init(){
for(int i=;i<=t;i++)
head[i]=-,du[i]=;
tot=;
}
int main(){
int p=read(); while(p--){
int n=read(),m=read();
s=,t=n+;
init();
while(m--){
int u=read(),v=read(),op=read();
du[u]++,du[v]--;
if(!op)
addedge(u,v,);
}
//jud
int flag=;
for(int i=;i<=n;i++){
if(du[i]&){
flag=;
break;
}
}
if(flag){
puts("impossible");
continue;
}
int sum=;
for(int i=;i<=n;i++){
if(du[i]<)
addedge(i,t,-du[i]/);
else if(du[i]>)
addedge(s,i,du[i]/),sum+=du[i]/;
}
if(sum!=dinic())
puts("impossible");
else
puts("possible");
}
return ;
}

混合欧拉回路poj 1637 Sightseeing tour的更多相关文章

  1. POJ 1637 Sightseeing tour(最大流)

    POJ 1637 Sightseeing tour 题目链接 题意:给一些有向边一些无向边,问能否把无向边定向之后确定一个欧拉回路 思路:这题的模型很的巧妙,转一个http://blog.csdn.n ...

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

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

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

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

  4. POJ 1637 Sightseeing tour (混合图欧拉路判定)

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6986   Accepted: 2901 ...

  5. POJ 1637 Sightseeing tour (SAP | Dinic 混合欧拉图的判断)

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6448   Accepted: 2654 ...

  6. POJ 1637 Sightseeing tour

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9276   Accepted: 3924 ...

  7. 网络流(最大流) POJ 1637 Sightseeing tour

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8628   Accepted: 3636 ...

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

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

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

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

随机推荐

  1. vscode中c/c++头文件引用找不到飘红

    正在进行 GTK 学习, 但是在 vscode GTK 的头文件找不到(头文件引用底下飘红, 逼死强迫症), 影响敲字键入速度. 解决一下该问题-- vscode中c/c++头文件引用找不到(#inc ...

  2. CountDownLatch和CyclicBarrier和Semaphore最通俗形象解释

    应该还有好多同学对这三个的区别比较模糊,网络上其他文章说的也比较专业化.所以我在这里举个例子说明这三个的区别. 我们假定有一场百米比赛,比赛包括十个运动员和一个裁判,每个运动员和每个裁判都是一个线程, ...

  3. Java web实现综合查询+SQL语句拼接

    首先展示图形界: 界面比较简单,但麻雀虽小五脏俱全.因为数据库只有六种数据类型,所以最多添加六个查询框. 测试以下问题: 删除方式是从上往下开始的,如果删除之后会有问题.(后续改进ing) 若干个并且 ...

  4. rewrite例子集合

    在 httpd 中将一个域名转发到另一个域名 虚拟主机世界近期更换了域名,新域名为 www.wbhw.com, 更加简短好记.这时需要将原来的域名 webhosting-world.com, 以及论坛 ...

  5. VUE- 引用视频组件

    VUE- 引用视频组件 安装依赖 cnpm install vue-video-player -S cnpm install video.js -S 全局引用: 在main.js中 import Vu ...

  6. 开发大型项目必备 98%公司都在用的十佳 Java Web 应用框架

    众所周知,工欲善其事,必先利其器.选择一个好的 Web 应用框架就像一把称手的兵器,可以助大家披荆斩棘. 今天就为大家整理了十佳 Java Web 应用框架,并简单讨论一下它们的优缺点. 第一,大名鼎 ...

  7. SQL注入——报错注入

    0x00 背景 SQL注入长期位于OWASP TOP10 榜首,对Web 安全有着很大的影响,黑客们往往在注入过程中根据错误回显进行判断,但是现在非常多的Web程序没有正常的错误回显,这样就需要我们利 ...

  8. linux设置网络三种方法

    http://blog.csdn.net/u010003835/article/details/52233296

  9. [Typora ] LaTeX公式输入

    [Typora 笔记] 数学输入整理 1.希腊字母表 大写 md 小写 md \(A\) A \(\alpha\) \alpha \(B\) B \(\beta\) \beta \(\Gamma\) ...

  10. Electron基础 - 如何创建模态窗体

    在开发桌面端应用我们常常需要弹出一个提示窗体或者对话框,而提示窗体和对话框和普通窗体的区别是,在提示框出现时,其它窗体就被锁定了,必须要等到提示框被正确关闭时其它窗体才能“解锁”,这种类型的窗体叫做模 ...