Euler Circuit UVA - 10735(混合图输出路径)
就是求混合图是否存在欧拉回路
如果存在则输出一组路径
(我就说嘛 咱的代码怎么可能错。。。。。最后的输出格式竟然w了一天 我都没发现)
解析:
对于无向边定向建边放到网络流图中add(u, v, 1);
对于有向边放到另一个图中add2(u, v);
然后就是混合边求是否有欧拉
一边dinic后 遍历每一条边 如果不是反向边 且 起点不是s 终点不是t
如果Node[i].c == 0 则 add2(Node[i].v, Node[i].u);
else add2(Node[i].u, Node[i].v);
然后用有向图的fleury输出边就好了
#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#include <cctype>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <bitset>
#define rap(i, a, n) for(int i=a; i<=n; i++)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define lap(i, a, n) for(int i=n; i>=a; i--)
#define lep(i, a, n) for(int i=n; i>a; i--)
#define rd(a) scanf("%d", &a)
#define rlld(a) scanf("%lld", &a)
#define rc(a) scanf("%c", &a)
#define rs(a) scanf("%s", a)
#define pd(a) printf("%d\n", a);
#define plld(a) printf("%lld\n", a);
#define pc(a) printf("%c\n", a);
#define ps(a) printf("%s\n", a);
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _ ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int maxn = , INF = 2e9;
int n, m, s, t, cnt;
int in[maxn], out[maxn], vis[maxn];
int d[maxn], head[maxn], cur[maxn];
set<int> ss;
int st[maxn],cnt3;
int cnt2, head2[maxn]; struct edge
{
int u, v, c, next, ff;
}Edge[maxn << ]; void add_(int u, int v, int c, int ff)
{
Edge[cnt].u = u;
Edge[cnt].v = v;
Edge[cnt].c = c;
Edge[cnt].ff = ff;
Edge[cnt].next = head[u];
head[u] = cnt++;
} void add(int u, int v, int c)
{
add_(u, v, c, );
add_(v, u, , );
} bool bfs()
{
queue<int> Q;
mem(d, );
Q.push(s);
d[s] = ;
while(!Q.empty())
{
int u = Q.front(); Q.pop();
for(int i = head[u]; i != -; i = Edge[i].next)
{
edge e = Edge[i];
if(!d[e.v] && e.c > )
{
d[e.v] = d[e.u] + ;
Q.push(e.v);
if(e.v == t) return ;
}
}
}
return d[t] != ;
} int dfs(int u, int cap)
{
int ret = ;
if(u == t || cap == )
return cap;
for(int &i = cur[u]; i != -; i = Edge[i].next)
{
edge e = Edge[i];
if(d[e.v] == d[u] + && e.c > )
{
int V = dfs(e.v, min(cap, e.c));
Edge[i].c -= V;
Edge[i^].c += V;
ret += V;
cap -= V;
if(cap == ) break;
}
}
if(cap > ) d[u] = -;
return ret;
} int Dinic(int u)
{
int ans = ;
while(bfs())
{
memcpy(cur, head, sizeof(head));
ans += dfs(u, INF);
}
return ans;
} struct node
{
int u, v, flag, next;
}Node[maxn << ]; void add2(int u, int v)
{
Node[cnt2].u = u;
Node[cnt2].v = v;
Node[cnt2].next = head2[u];
Node[cnt2].flag = ;
head2[u] = cnt2++;
}
int used[maxn];
void fleury(int u)
{
for(int i = head2[u]; i != -; i = Node[i].next)
{
if(!used[i])
{
used[i] = ;
fleury(Node[i].v);
} }
st[cnt3++] = u;
} void init()
{
mem(in, );
mem(head, -);
mem(out, );
mem(st, );
cnt = ;
cnt2 = ;
cnt3 = ;
mem(head2, -);
mem(used, );
ss.clear(); } char str[]; int main()
{
int T;
cin >> T;
while(T--)
{
int u, v, w;
cin >> n >> m;
init();
s = , t = maxn - ;
for(int i = ; i <= m; i++)
{
scanf("%d%d%s", &u, &v, str);
in[v]++, out[u]++;
if(str[] == 'U') add(u, v, );
else if(str[] == 'D') add2(u, v);
}
int flag = , m_sum = ;
for(int i = ; i <= n; i++)
{
if(abs(out[i] - in[i]) & )
{
flag = ;
break;
}
if(out[i] > in[i]) add(s, i, (out[i] - in[i]) / ), m_sum += (out[i] - in[i]) / ;
else if(in[i] > out[i]) add(i, t, (in[i] - out[i]) / ); }
if(!flag && m_sum == Dinic(s))
{
for(int i = ; i < cnt; i++)
{
if(!Edge[i].ff || Edge[i].u == s || Edge[i].v == t) continue;
if(Edge[i].c == ) add2(Edge[i].v, Edge[i].u);
else add2(Edge[i].u, Edge[i].v);
}
fleury();
for(int i = cnt3 - ; i >= ; i--)
{
if(i != cnt3 - ) printf(" ");
printf("%d", st[i]);
} printf("\n"); }
else
cout << "No euler circuit exist" << endl;
if(T) printf("\n"); } return ;
}
Euler Circuit UVA - 10735(混合图输出路径)的更多相关文章
- UVa 10735 (混合图的欧拉回路) Euler Circuit
题意: 给出一个图,有的边是有向边,有的是无向边.试找出一条欧拉回路. 分析: 按照往常的思维,遇到混合图,我们一般会把无向边拆成两条方向相反的有向边. 但是在这里却行不通了,因为拆成两条有向边的话, ...
- poj1122 FDNY to the Rescue!(dij+反向建图+输出路径)
题目链接:poj1122 FDNY to the Rescue! 题意:给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路口之间没有直接路径,再给 ...
- UVA 10735 Euler Circuit 混合图的欧拉回路(最大流,fluery算法)
题意:给一个图,图中有部分是向边,部分是无向边,要求判断是否存在欧拉回路,若存在,输出路径. 分析:欧拉回路的定义是,从某个点出发,每条边经过一次之后恰好回到出发点. 无向边同样只能走一次,只是不限制 ...
- 紫书 例题 11-13 UVa 10735(混合图的欧拉回路)(最大流)
这道题写了两个多小时-- 首先讲一下怎么建模 我们的目的是让所有点的出度等于入度 那么我们可以把点分为两部分, 一部分出度大于入度, 一部分入度大于出度 那么显然, 按照书里的思路,将边方向后,就相当 ...
- UVa 10735 - Euler Circuit(最大流 + 欧拉回路)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 10735 Euler Circuit (最大流)
题意:求混合图的欧拉路径. 一句话总结:网络流,最主要在于建图,此题是将出度则是和流量联系在了一起,用最大流来调整边的指向. 分析: 这题的困难之处在于无向边只能用一次,相当于一个方向未定的有向边. ...
- UVA-10735 - Euler Circuit(混合欧拉回路输出)
题意:给你一个图,有N个点,M条边,这M条边有的是单向的,有的是双向的. 问你能否找出一条欧拉回路,使得每条边都只经过一次! 分析: 下面转自别人的题解: 把该图的无向边随便定向,然后计算每个点的入度 ...
- UVA LIVE-3263 - That Nice Euler Circuit
画一个顶点为偶数的封闭的二维图,当然.这个图能够自交,给出画的过程中的一些轨迹点.求出这个图把二次元分成了几部分,比如三角形把二次元分成了两部分. 这个的话,有图中顶点数+部分数-棱数=2的定律,这是 ...
- Uva 1342 - That Nice Euler Circuit
Little Joey invented a scrabble machine that he called Euler, after the great mathematician. In his ...
随机推荐
- Thrift 入门教程
1. 概述 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Go,Python, PHP, Ruby, Erl ...
- AV-TEST杀毒软件能力测试(2018年1月-12月)杀毒软件排名
2018年1月到12月,AV-TEST攻击了实验室中无数的Windows系统,在830多项单独测试中测试了7种杀毒软件和5种快捷工具. 1.测试概述 在长期测试中,实验室在各种实际场景中测试了杀毒软件 ...
- Android入门第一课之Java基础
通知:由于本周六场地申请没通过,所以本周的培训临时取消. 今天给大家带来的是Android入门的第一课,由于教室申请的不确定性,因此,每次培训的内容都会在博客先提前释放出来.首先Android的APP ...
- bootstrap-treeview 在 bootstrap 4 不兼容解决办法及使用
bootstrap-treeview 是bootstrap的一个树形插件,插件依赖: bootstrap/3.3.7 jquery/3.3.1 经过验证,它不可以在 bootstrap 高于 3.3. ...
- 某jiub笔试
一.选择题 1.下列说法正确的有()A. class中的constructor不可省略B. constructor必须与class同名,但方法不能与class同名C.constructor在一个对象被 ...
- 建立第一个SpringBoot小列子(碰到的错误)
当加入@SpringBootApplication注解时,无法得到解析 错误提示:SpringBootApplication cannot be resolved to a type 错误原因是因为s ...
- Python面试笔记二
一.算法 1.归并排序 2.快速排序 3.算法复杂度 4.哈希表数据结构 二.数据库 1.设计一个用户关注系统的数据库表 1.设计一个用户关注系统的数据库表,写三个相关的SQL语句两张表,一张user ...
- WPF中自定义标题栏时窗体最大化处理之WindowChrome
注意: 本文方法基础是WindowChrome,而WindowChrome在.NET Framework 4.5之后才集成发布的.见:WindowChrome Class 在.NET Framewor ...
- yuan 老师 之 Django
前端: 1.前端基础之JavaScript https://www.cnblogs.com/yuanchenqi/articles/6893904.html 2.前端基础之jQuery https:/ ...
- Spring-扫描注解原理,注解自动扫描原理分析
注解自动扫描原理分析 在spring的配置文件中加入如下代码,spring便开启了自动扫描,那么它的底层到底是如何实现的呢? <context:component-scan base-packa ...