poj1637 Sightseeing tour 混合图欧拉回路判定
传送门
第一次做这种题, 尽管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 混合图欧拉回路判定相关推荐
- POJ 1637 Sightseeing tour 混合图欧拉回路存在性判断
没有想到网络流还能解决这一类问题,完全想不到@_@ 一开始把所有的无向边制定任意方向有当做有向边看,然后统计每个点的入度和出度.以前有向图的欧拉回路判定是每个点的入读都等于出度,这样可以保证可以回到起 ...
- 2095: [Poi2010]Bridges 二分+混合图欧拉回路(网络流)
好厉害的题啊QAQ,并不会做. 最大值最小想到是二分,然后就是一个混合图欧拉回路的问题. 混合图欧拉回路问题的解决: 我们首先想到有向图的欧拉回路,需满足的条件是每个点的入度等于出度.那么对于一个混合 ...
- BZOJ2095 POI2010 Bridges 【二分+混合图欧拉回路】
BZOJ2095 POI2010 Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛 ...
- TZOJ 2099 Sightseeing tour(网络流判混合图欧拉回路)
描述 The city executive board in Lund wants to construct a sightseeing tour by bus in Lund, so that to ...
- POJ - 1637 Sightseeing tour(混合图欧拉回路的求解--建图跑最大流)
题目链接:https://vjudge.net/contest/399194#problem/B The city executive board in Lund wants to construct ...
- poj 1637 Sightseeing tour 混合欧拉图判定
POJ - 1637点我点我:-) Sightseeing tour Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %ll ...
- BZOJ 2095 [Poi2010]Bridges 二分 最大流(混合图欧拉回路)
题目大意:给出一张n个点m条边的联通图,无重边,每条边有正反两个权值.现要从点1出发经过每条边每个点一次,问最大边权最小是多少. 最大最小容易想到二分,问题是如何判断是否有欧拉回路. 图不连通自然没有 ...
- [BZOJ2095][Poi2010]Bridges 最大流(混合图欧拉回路)
2095: [Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MB Description YYD为了减肥,他来到了瘦海,这是一个巨大的海, ...
- Bzoj2095:[Poi2010]Bridges:混合图欧拉回路,网络流
题目链接:2095:[Poi2010]Bridges 二分答案建图后显然是混合图的欧拉回路,有向边删掉无向边随机定向计算入度-出度的差du[i],如果du[i]<0连边(i,T,-du[i]/2 ...
- POJ1637 Sightseeing tour(判定混合图欧拉回路)
有向连通图存在欧拉回路的充要条件是所有点入度=出度. 首先随便给定所有无向边一个方向(不妨直接是u->v方向),记录所有点的度(记:度=入度-出度). 这时如果有点的度不等于0,那么就不存在欧拉 ...
最新文章
- python好难找工作_Python 太难找工作了
- 移动端取消button点击出现阴影效果
- 阿里云ONS而微软Azure Service Bus体系结构和功能比较
- 前瞻:Spring 6.0将停止支持Freemarker和JSP
- html中函数传递多个值,JavaScript 实战开发经验!函数多参数传参技巧
- 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法
- secp256k1 php,区块链中的数学-secp256k1 签名可锻性以及解决方案
- 项目管理学习总结(5)——产品开发过程中各角色职责说明和技能要求
- android中自定义 toast,android 自定义Toast样式和显示方式
- tomcat,zookeeper,activeMQ,Kafka设置jvm参数
- java 同音字_pinyin: The high performance pinyin tool for java.(java 高性能中文转拼音工具。支持同音字。)...
- 【字体分享】适合寒露闪屏设计的字体有哪些?
- 公众号前端开发配置流程
- 利用Yocto构建嵌入式Linux教程02--Yocto的一些基本概念介绍
- 2019最新微信公众平台PHP开发搭建与揭秘(附代码)
- 更多内容请移步GitHub
- 【Python】random.randint()用法
- 趁我酒醉后专车司机想要非礼我
- 【论文查询】如何查询论文被其他哪些文献引用过?超详细!!!
- 计算方法(二):n次多项式插值