题意

传送门 POJ 1637

题解

有向图存在欧拉回路的充要条件: 所有顶点入度等于出度,且图为连通图。

混合图存在欧拉回路的判断的基本思路: 混合图 G(V,E)G(V,E)G(V,E) 通过假设无向边方向使之变成有向图 G′(V,E′)G'(V,E')G′(V,E′),若存在一个 G′(V,E′)G'(V,E')G′(V,E′) 使之存在欧拉回路,则 G(V,E)G(V,E)G(V,E) 存在欧拉回路。

混合图存在欧拉回路的问题,则转化为找到一个无向边的定向方案,使混合图的所有顶点入度等于出度。基本思路是线假设一个有向图 G′(V,E′)G'(V,E')G′(V,E′),再不断调整无向边的方向,使其满足所有顶点入度等于出度。

使用最大流模型求解: 首先为每一条无向边假设一个方向,并计算顶点的出度 outDegoutDegoutDeg 与入度 inDeginDeginDeg;取源点 sss 与汇点 ttt,对于出度大于入度的点 vvv,从 sss 向 vvv 连一条容量为 (outDeg−inDeg)/2(outDeg-inDeg)/2(outDeg−inDeg)/2 的边,对于入度大于出度的点 uuu,从 uuu 向 ttt 连一条容量为 (inDeg−outDeg)/2(inDeg-outDeg)/2(inDeg−outDeg)/2 的边,计算容量 /2/2/2 这一步是因为若某条无向边调整为当前假设方向的反方向,对于其端点而言,abs(Δ(outDeg−inDeg))=2abs(\Delta (outDeg-inDeg))=2abs(Δ(outDeg−inDeg))=2;对于混合图中所有无向边,按照假定的方向建有向图,有向边因为方向无法调整故不在图中建边。

若最大流满流,将 sss 至 ttt 的流量反向,此时满足所有顶点入度等于出度,存在一个 G′(V,E′)G'(V,E')G′(V,E′) 使之存在欧拉回路,则混合图存在欧拉回路。

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))#define INF 0x3f3f3f3f
#define MAX_V 205
typedef int capType;
struct edge
{int to, rev;capType cap;edge(int to, int rev, capType cap) : to(to), rev(rev), cap(cap) {}
};
int V;
vector<edge> G[MAX_V];
int level[MAX_V], iter[MAX_V];void add_edge(int from, int to, capType cap)
{G[from].push_back(edge(to, G[to].size(), cap));G[to].push_back(edge(from, G[from].size() - 1, 0));
}void bfs(int s)
{memset(level, -1, sizeof(level));queue<int> que;level[s] = 0;que.push(s);while (!que.empty()){int v = que.front();que.pop();for (int i = 0; i < G[v].size(); i++){edge &e = G[v][i];if (e.cap > 0 && level[e.to] < 0){level[e.to] = level[v] + 1;que.push(e.to);}}}
}capType dfs(int v, int t, capType f)
{if (v == t)return f;for (int &i = iter[v]; i < G[v].size(); i++){edge &e = G[v][i];if (e.cap > 0 && level[v] < level[e.to]){capType d = dfs(e.to, t, min(f, e.cap));if (d > 0){e.cap -= d;G[e.to][e.rev].cap += d;return d;}}}return 0;
}capType max_flow(int s, int t)
{capType flow = 0;for (;;){bfs(s);if (level[t] < 0)return flow;memset(iter, 0, sizeof(iter));capType f;while ((f = dfs(s, t, INF)) > 0){flow += f;}}
}void clear_graph()
{for (int v = 0; v < V; v++) G[v].clear();
}#define maxm 205
#define maxs 1005
int M, S, deg[maxm], x[maxs], y[maxs], d[maxs];void solve()
{int f = 0, s = 0, t = M + 1;V = t + 1;clear_graph();for (int i = 1; i <= M; i++){if (abs(deg[i]) & 1){puts("impossible");return;}if (deg[i] > 0){add_edge(s, i, deg[i] / 2);f += deg[i] / 2;}if (deg[i] < 0){add_edge(i, t, -deg[i] / 2);}}for (int i = 0; i < S; i++){if (d[i] == 1) continue;add_edge(x[i], y[i], 1);}puts(max_flow(s, t) == f ? "possible" : "impossible");
}int main()
{int t;scanf("%d", &t);while (t--){memset(deg, 0, sizeof(deg));scanf("%d%d", &M, &S);for (int i = 0; i < S; i++){scanf("%d%d%d", x + i, y + i, d + i);deg[x[i]]++, deg[y[i]]--;}solve();}return 0;
}

POJ 1637 混合图的欧拉回路 + Dinic相关推荐

  1. poj 1637(混合图求欧拉回路)

    参考博客:http://www.cnblogs.com/destinydesigner/archive/2009/09/28/1575674.html 1 定义 欧拉通路 (Euler tour)-- ...

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

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

  3. 欧拉回路(混合图的欧拉回路)

    /* ID: linjd821 LANG: C++ TASK: sightseeing */ //zju 1992 //混合图的欧拉回路,用网络流调整无向边 /* //转自某位牛人blog 混合图欧拉 ...

  4. poj1637(混合图判欧拉回路)

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

  5. Bzoj2095:[Poi2010]Bridges:混合图欧拉回路,网络流

    题目链接:2095:[Poi2010]Bridges 二分答案建图后显然是混合图的欧拉回路,有向边删掉无向边随机定向计算入度-出度的差du[i],如果du[i]<0连边(i,T,-du[i]/2 ...

  6. poj 1637 Sightseeing tour 混合欧拉图判定

    POJ - 1637点我点我:-) Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %ll ...

  7. 混合图的欧拉路径和欧拉回路判断

    混合图(既有有向边又有无向边的图)中欧拉环.欧拉路径的判定需要借助网络流!(1)欧拉环的判定: 一开始当然是判断原图的基图是否连通,若不连通则一定不存在欧拉环或欧拉路径(不考虑度数为0的点).其实,难 ...

  8. 2095: [Poi2010]Bridges 二分+混合图欧拉回路(网络流)

    好厉害的题啊QAQ,并不会做. 最大值最小想到是二分,然后就是一个混合图欧拉回路的问题. 混合图欧拉回路问题的解决: 我们首先想到有向图的欧拉回路,需满足的条件是每个点的入度等于出度.那么对于一个混合 ...

  9. BZOJ 2095 [Poi2010]Bridges 二分 最大流(混合图欧拉回路)

    题目大意:给出一张n个点m条边的联通图,无重边,每条边有正反两个权值.现要从点1出发经过每条边每个点一次,问最大边权最小是多少. 最大最小容易想到二分,问题是如何判断是否有欧拉回路. 图不连通自然没有 ...

最新文章

  1. Spring JPA 开启原生sql打印
  2. serializable接口_Java Serializable:明明就一个空的接口嘛
  3. linux 系统盘无法ls,系统故障排除
  4. 路由器网络性能测试软件,路由器性能测试
  5. Going to 的将来时态_47
  6. java锁包读写锁_Java并发包7--读写锁ReentrantReadWriteLock的实现原理解析
  7. python生成日志文件_Python 日志生成器
  8. 管理感悟:就事不论事
  9. 华为摄像机搜索软件_华为放大招!概念股掀涨停潮,A股全产业链名单曝光(附名单)...
  10. 软件开发团队中各个成员的英文简称
  11. 《区块链+》读书感想
  12. ISDA 国际掉期交易协会
  13. 判断一个点是否在闭合曲线内
  14. Win11家庭版如何安装组策略编辑器
  15. 曙光服务器管理系统,曙光Gridview服务器管理系统单机版v2.0用户手册.pdf
  16. iOS storyboard 用法详解
  17. 胎儿超声标准切面 图与详解
  18. QT实现浮层绘制、样式处理、显示时机、躲避屏幕边缘功能
  19. 【模电实验】日光灯电路及功率因数的提高
  20. 【沐风老师】3dMax一键生成中央空调排风口插件使用教程

热门文章

  1. 如何让自己打计算机打字快起来,电脑快速打字的技巧
  2. 服务器文件增量备份,服务器文件增量备份
  3. 小米air2se耳机只有一边有声音怎么办_校园场景实测,JEET ONE与小米Air 2se蓝牙耳机哪款更好用?...
  4. 微型计算机ALE,微型计算机技术课后习题一二三章答案
  5. 【程序员情商up】说话的智慧
  6. vue 中deep使用
  7. centos7.6修改分辨率
  8. 【干货】动力电池热管理设计流程和方法(11页ppt)
  9. java实现表情符号过滤
  10. tcp和udp的基本函数调用过程及如何选择