POJ 1637 Sightseeing tour

题目链接

题意:给一些有向边一些无向边,问能否把无向边定向之后确定一个欧拉回路

思路:这题的模型很的巧妙,转一个http://blog.csdn.net/pi9nc/article/details/12223693

先把有向边随意定向了,然后依据每一个点的入度出度之差,能够确定每一个点须要调整的次数,然后中间就是须要调整的边,容量为1,这样去建图最后推断从源点出发的边是否都满流就可以

代码:

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;const int MAXNODE = 205;
const int MAXEDGE = 10005;typedef int Type;
const Type INF = 0x3f3f3f3f;struct Edge {int u, v;Type cap, flow;Edge() {}Edge(int u, int v, Type cap, Type flow) {this->u = u;this->v = v;this->cap = cap;this->flow = flow;}
};struct Dinic {int n, m, s, t;Edge edges[MAXEDGE];int first[MAXNODE];int next[MAXEDGE];bool vis[MAXNODE];Type d[MAXNODE];int cur[MAXNODE];vector<int> cut;void init(int n) {this->n = n;memset(first, -1, sizeof(first));m = 0;}void add_Edge(int u, int v, Type cap) {edges[m] = Edge(u, v, cap, 0);next[m] = first[u];first[u] = m++;edges[m] = Edge(v, u, 0, 0);next[m] = first[v];first[v] = m++;}bool bfs() {memset(vis, false, sizeof(vis));queue<int> Q;Q.push(s);d[s] = 0;vis[s] = true;while (!Q.empty()) {int u = Q.front(); Q.pop();for (int i = first[u]; i != -1; i = next[i]) {Edge& e = edges[i];if (!vis[e.v] && e.cap > e.flow) {vis[e.v] = true;d[e.v] = d[u] + 1;Q.push(e.v);}}}return vis[t];}Type dfs(int u, Type a) {if (u == t || a == 0) return a;Type flow = 0, f;for (int &i = cur[u]; i != -1; i = next[i]) {Edge& e = edges[i];if (d[u] + 1 == d[e.v] && (f = dfs(e.v, min(a, e.cap - e.flow))) > 0) {e.flow += f;edges[i^1].flow -= f;flow += f;a -= f;if (a == 0) break;}}return flow;}bool Maxflow(int s, int t) {this->s = s; this->t = t;Type flow = 0;while (bfs()) {for (int i = 0; i < n; i++)cur[i] = first[i];flow += dfs(s, INF);}for (int i = first[0]; i + 1; i = next[i])if (edges[i].flow != edges[i].cap) return false;return true;}void MinCut() {cut.clear();for (int i = 0; i < m; i += 2) {if (vis[edges[i].u] && !vis[edges[i].v])cut.push_back(i);}}
} gao;const int N = 205;
const int M = 1005;int t, n, m, in[N], out[N];
int u[M], v[M], w[M];bool solve() {gao.init(n + 2);for (int i = 1; i <= n; i++) {if ((in[i] + out[i]) % 2) return false;if (in[i] > out[i]) gao.add_Edge(i, n + 1, (in[i] - out[i]) / 2);if (out[i] > in[i]) gao.add_Edge(0, i, (out[i] - in[i]) / 2);}for (int i = 0; i < m; i++) {if (w[i]) continue;gao.add_Edge(u[i], v[i], 1);}return gao.Maxflow(0, n + 1);
}int main() {scanf("%d", &t);while (t--) {scanf("%d%d", &n, &m);memset(in, 0, sizeof(in));memset(out, 0, sizeof(out));for (int i = 0; i < m; i++) {scanf("%d%d%d", &u[i], &v[i], &w[i]);in[v[i]]++;out[u[i]]++;}printf("%s\n", solve() ? "possible" : "impossible");}return 0;
}

转载于:https://www.cnblogs.com/mengfanrong/p/4298671.html

POJ 1637 Sightseeing tour(最大流)相关推荐

  1. poj 1637 Sightseeing tour——最大流+欧拉回路

    题目:http://poj.org/problem?id=1637 先给无向边随便定向,如果一个点的入度大于出度,就从源点向它连 ( 入度 - 出度 / 2 ) 容量的边,意为需要流出去这么多:流出去 ...

  2. POJ - 1637 Sightseeing tour(混合图欧拉回路的求解--建图跑最大流)

    题目链接:https://vjudge.net/contest/399194#problem/B The city executive board in Lund wants to construct ...

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

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

  4. poj 1637 Sightseeing tour 混合欧拉 最大流

    #include <cstdio> #include <vector> #include <queue> #include <cstring> usin ...

  5. poj 1637 Sightseeing tour

    http://poj.org/problem?id=1637 题意: 给出一张混合图,判断是否存在欧拉回路 原理: 1.存在欧拉回路的充要条件:所有点入度=出度 2.给无向边随便定向不会影响点的|出度 ...

  6. POJ 1637 Sightseeing tour 混合图欧拉回路存在性判断

    没有想到网络流还能解决这一类问题,完全想不到@_@ 一开始把所有的无向边制定任意方向有当做有向边看,然后统计每个点的入度和出度.以前有向图的欧拉回路判定是每个点的入读都等于出度,这样可以保证可以回到起 ...

  7. TZOJ 2099 Sightseeing tour(网络流判混合图欧拉回路)

    描述 The city executive board in Lund wants to construct a sightseeing tour by bus in Lund, so that to ...

  8. POJ 1637 混合图的欧拉回路 + Dinic

    题意 传送门 POJ 1637 题解 有向图存在欧拉回路的充要条件: 所有顶点入度等于出度,且图为连通图. 混合图存在欧拉回路的判断的基本思路: 混合图 G(V,E)G(V,E)G(V,E) 通过假设 ...

  9. 解题报告:POJ 3281 Dining(最大流 / “三分图”建图)

    B.POJ 3281 DiningDiningDining(最大流/建图模板)[省选/NOI- ] 有 F 种食物和 D 种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一 种食物和一种饮料.现 ...

最新文章

  1. 在java中使用redis
  2. 红黑树的删除_Python实现红黑树的删除操作
  3. 赞!Google 资深软件工程师 LeetCode 刷题笔记首次公开
  4. iOS8 TabBarItem设置自定义图片问题
  5. 前端学习(3240):react生命周期forceUpdate
  6. 知识图谱:刻画事物关系,沉淀领域知识!
  7. Farrago for Mac(强大的现场多音频播放工具)
  8. java检索账号和密码_如何从数据库中检索密码
  9. Android系统架构与系统源码目录
  10. 全国最大SLAM开发者学习交流社区 欢迎加入
  11. 你的缺点是什么?资深HR教你套路面试官
  12. springboot+调用支付宝第三方接口(沙箱环境)
  13. 安卓app,iOS二维码下载链接FIR
  14. 将折旧表分配至公司代码时提示公司代码分录不完全解决方案
  15. 【MySQL】# mysql计算两个时间的差值
  16. 「HNOI2004」 宠物收养所 - 平衡树Splay
  17. 纳米金/银修饰空心/杂化/纳米管和链霉亲和素修饰/纳米金粒子修饰单分散聚苯乙烯微球制备方式
  18. QQ玩一玩(轻游戏)开发环境搭建与调试
  19. 分享 6 个百度出品的免费工具,你用过几个?
  20. 绘制pdf表格 (二) 通过itext实现在pdf中绘制excel表格样式设置中文字体、水印、logo、页眉、页码

热门文章

  1. HTML表单的enctype属性详解{转}
  2. cvpr 2015 2016论文地址
  3. Opencv-Python部署SIFT函数问题的处理
  4. 【知识发现】隐语义模型LFM算法python实现(三)
  5. java动态字段排序_JAVA 列表动态增加字段显示和任意字段排序
  6. 普通函数与函数模板的区别
  7. 计算机组成原理——数据表示、运算与校验1
  8. python连接oracle
  9. Linux服务器oracle数据库重启服务、重启监听方法,oracle数据库sysdba管理员登录方法
  10. STM32下一次程序后J-link不能识别问题解决