传送门

第一次做这种题, 尽管ac了但是完全不知道为什么这么做。

题目就是给一些边, 有向边与无向边混合, 问你是否存在欧拉回路。

做法是先对每个点求入度和出度, 如果一条边是无向边, 就随便指定一个方向, 然后连一条边, 权值为1。 最后统计入度出度, 如果一个点的(入度-出度)%2==1, 就说明不存在欧拉回路。 如果全都满足, 就判断每个点的入度出度的大小关系, 入度>出度, 就向汇点连一条边, 权值为(入度-出度)/2, 相反的话就向源点连边。

跑一遍最大流, 看是否满流, 如果满流就说明存在。

完全不理解.....还是太弱。

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define pb(x) push_back(x)
  4 #define ll long long
  5 #define mk(x, y) make_pair(x, y)
  6 #define lson l, m, rt<<1
  7 #define mem(a) memset(a, 0, sizeof(a))
  8 #define rson m+1, r, rt<<1|1
  9 #define mem1(a) memset(a, -1, sizeof(a))
 10 #define mem2(a) memset(a, 0x3f, sizeof(a))
 11 #define rep(i, a, n) for(int i = a; i<n; i++)
 12 #define ull unsigned long long
 13 typedef pair<int, int> pll;
 14 const double PI = acos(-1.0);
 15 const double eps = 1e-8;
 16 const int mod = 1e9+7;
 17 const int inf = 1061109567;
 18 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
 19 const int maxn = 210;
 20 const int maxE = 10005;
 21 int indeg[maxn], outdeg[maxn];
 22 int head[maxE], s, t, num, q[maxE], dis[maxn];
 23 struct node
 24 {
 25     int to, nextt, c;
 26 }e[maxE];
 27 void init() {
 28     mem1(head);
 29     num = 0;
 30     mem(indeg);
 31     mem(outdeg);
 32 }
 33 void add(int u, int v, int c) {
 34     e[num].to = v; e[num].nextt = head[u]; e[num].c = c; head[u] = num++;
 35     e[num].to = u; e[num].nextt = head[v]; e[num].c = 0; head[v] = num++;
 36 }
 37 int bfs() {
 38     mem(dis);
 39     int st = 0, ed = 0;
 40     q[ed++] = s;
 41     dis[s] = 1;
 42     while(st<ed) {
 43         int u = q[st++];
 44         for(int i = head[u]; ~i; i = e[i].nextt) {
 45             int v = e[i].to;
 46             if(e[i].c&&!dis[v]) {
 47                 dis[v] = dis[u]+1;
 48                 if(v == t)
 49                     return 1;
 50                 q[ed++] = v;
 51             }
 52         }
 53     }
 54     return 0;
 55 }
 56 int dfs(int u, int limit) {
 57     if(u == t)
 58         return limit;
 59     int cost = 0;
 60     for(int i = head[u]; ~i; i = e[i].nextt) {
 61         int v = e[i].to;
 62         if(e[i].c&&dis[v] == dis[u]+1) {
 63             int tmp = dfs(v, min(limit-cost, e[i].c));
 64             if(tmp>0) {
 65                 e[i].c -= tmp;
 66                 e[i^1].c += tmp;
 67                 cost += tmp;
 68                 if(limit == cost)
 69                     break;
 70             } else {
 71                 dis[v] = -1;
 72             }
 73         }
 74     }
 75     return cost;
 76 }
 77 int dinic() {
 78     int ans = 0;
 79     while(bfs()) {
 80         ans += dfs(s, inf);
 81     }
 82     return ans;
 83 }
 84 int main()
 85 {
 86     int T, n, m, x, y, z;
 87     cin>>T;
 88     while(T--) {
 89         scanf("%d%d", &n, &m);
 90         init();
 91         s = 0, t = n+1;
 92         while(m--) {
 93             scanf("%d%d%d", &x, &y, &z);
 94             indeg[y]++;
 95             outdeg[x]++;
 96             if(z == 0) {
 97                 add(x, y, 1);
 98             }
 99         }
100         int flag = 0;
101         for(int i = 1; i<=n; i++) {
102             if(abs(indeg[i]-outdeg[i])%2==1) {
103                 flag = 1;
104                 break;
105             }
106         }
107         if(flag) {
108             cout<<"impossible"<<endl;
109             continue;
110         }
111         int sum = 0;
112         for(int i = 1; i<=n; i++) {
113             if(indeg[i]<outdeg[i]) {
114                 add(s, i, (outdeg[i]-indeg[i])/2);
115             } else {
116                 add(i, t, (indeg[i]-outdeg[i])/2);
117                 sum += (indeg[i]-outdeg[i])/2;
118             }
119         }
120         int ans = dinic();
121         if(ans == sum) {
122             cout<<"possible"<<endl;
123         } else {
124             cout<<"impossible"<<endl;
125         }
126     }
127 }

转载于:https://www.cnblogs.com/yohaha/p/5011399.html

poj1637 Sightseeing tour 混合图欧拉回路判定相关推荐

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

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

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

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

  3. BZOJ2095 POI2010 Bridges 【二分+混合图欧拉回路】

    BZOJ2095 POI2010 Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛 ...

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

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

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

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

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

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

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

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

  8. [BZOJ2095][Poi2010]Bridges 最大流(混合图欧拉回路)

    2095: [Poi2010]Bridges Time Limit: 10 Sec  Memory Limit: 259 MB Description YYD为了减肥,他来到了瘦海,这是一个巨大的海, ...

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

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

  10. POJ1637 Sightseeing tour(判定混合图欧拉回路)

    有向连通图存在欧拉回路的充要条件是所有点入度=出度. 首先随便给定所有无向边一个方向(不妨直接是u->v方向),记录所有点的度(记:度=入度-出度). 这时如果有点的度不等于0,那么就不存在欧拉 ...

最新文章

  1. python好难找工作_Python 太难找工作了
  2. 移动端取消button点击出现阴影效果
  3. 阿里云ONS而微软Azure Service Bus体系结构和功能比较
  4. 前瞻:Spring 6.0将停止支持Freemarker和JSP
  5. html中函数传递多个值,JavaScript 实战开发经验!函数多参数传参技巧
  6. 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法
  7. secp256k1 php,区块链中的数学-secp256k1 签名可锻性以及解决方案
  8. 项目管理学习总结(5)——产品开发过程中各角色职责说明和技能要求
  9. android中自定义 toast,android 自定义Toast样式和显示方式
  10. tomcat,zookeeper,activeMQ,Kafka设置jvm参数
  11. java 同音字_pinyin: The high performance pinyin tool for java.(java 高性能中文转拼音工具。支持同音字。)...
  12. 【字体分享】适合寒露闪屏设计的字体有哪些?
  13. 公众号前端开发配置流程
  14. 利用Yocto构建嵌入式Linux教程02--Yocto的一些基本概念介绍
  15. 2019最新微信公众平台PHP开发搭建与揭秘(附代码)
  16. 更多内容请移步GitHub
  17. 【Python】random.randint()用法
  18. 趁我酒醉后专车司机想要非礼我
  19. 【论文查询】如何查询论文被其他哪些文献引用过?超详细!!!
  20. 计算方法(二):n次多项式插值

热门文章

  1. bottle框架学习(四)之模版进阶使用
  2. 在windows系统中使用backoff2005的测试脚本来测试分词结果
  3. 纯CSS实现鼠标滑过缩略图放大显示代码
  4. 产品经理给程序员发了一个“在吗”
  5. 21大软件架构特点的全面解析
  6. 来自Google的面试题,真的有趣!果然与众不同
  7. 一个工作三年左右的Java程序员跟大家分享从业心得
  8. 我们精心整理的2019最新全栈资料!首次公布
  9. 什么样的公司值得加入?
  10. windows操作系统_windows下用深度系统安装器安装深度操作系统实现双系统分别运行...