【欧拉回路】【欧拉路径】【Fleury算法】CDOJ1634 记得小苹初见,两重心字罗衣
Fleury算法看这里 http://hihocoder.com/problemset/problem/1181

把每个点看成边,每个横纵坐标看成一个点,得到一个无向图.
如果新图中每个点的度都是偶数,那么就是一个欧拉图,对该图跑一遍欧拉回路,对走过的边轮流染色,就可以保证每个点所连的边的红蓝颜色相等.
如果存在度数为奇数的点,新建两个点a和b.把横坐标的度数为奇数的点和a连边,把纵坐标为奇数的点和b连边,这样最多只有a和b的度数为奇数,可以跑欧拉路径.



注意Fleury算法的时候,要及时把访问过的边从图中删去(真的删去而不是打标记),否则重复访问会导致复杂度飙升。
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
struct Edge{
int v,id;
};
vector<Edge>G[400010];
int n,S,T;
bool anss[200010],pen,vis[600010];
inline void dfs(int U){
while(!G[U].empty()){
Edge e=G[U].back();
G[U].pop_back();
if(!vis[e.id]){
vis[e.id]=1;
dfs(e.v);
if(e.id<=n){
anss[e.id]=pen;
pen^=1;
}
}
}
}
int main(){
// freopen("c.in","r",stdin);
int x,y;
scanf("%d",&n);
S=400001; T=400002;
for(int i=1;i<=n;++i){
scanf("%d%d",&x,&y);
G[x].push_back((Edge){y+200000,i});
G[y+200000].push_back((Edge){x,i});
}
int cnt=n;
for(int i=1;i<=200000;++i){
if(G[i].size()&1){
G[S].push_back((Edge){i,++cnt});
G[i].push_back((Edge){S,cnt});
}
}
for(int i=200001;i<=400000;++i){
if(G[i].size()&1){
G[i].push_back((Edge){T,++cnt});
G[T].push_back((Edge){i,cnt});
}
}
if(G[S].size()&1){
dfs(S);
}
if(!G[T].empty()){
dfs(T);
}
for(int i=1;i<=200000;++i){
if(!G[i].empty()){
dfs(i);
}
}
for(int i=1;i<=n;++i){
putchar(anss[i] ? 'r' : 'b');
}
puts("");
return 0;
}
【欧拉回路】【欧拉路径】【Fleury算法】CDOJ1634 记得小苹初见,两重心字罗衣的更多相关文章
- 【欧拉回路】【Fleury算法】CDOJ1642 老当益壮, 宁移白首之心?
题意: 构造一个01串,使得满足以下条件: 1. 环状(即首尾相连) 2. 每一位取值为0或1 3. 长度是2^n 4. 对于每个(2^n个)位置,从其开始沿逆时针方向的连续的n位01串(包括自己) ...
- Fleury算法 求欧拉回路
Fleury算法 #include <iostream> #include <cstdio> #include <cstring> #include <cma ...
- 欧拉回路&欧拉路径学习笔记
基础性质(用来判定): 1.无向图欧拉回路没有奇数点 (有向图所有点入度等于出度) 2.无向图欧拉路径只有两个奇数点 (有向图有一个顶点入度比出度大1,有一个顶点出度比入度大1,其他的全相等) 3.图 ...
- hiho欧拉路·二 --------- Fleury算法求欧拉路径
hiho欧拉路·二 分析: 小Ho:这种简单的谜题就交给我吧! 小Hi:真的没问题么? <10分钟过去> 小Ho:啊啊啊啊啊!搞不定啊!!!骨牌数量一多就乱了. 小Hi:哎,我就知道你会遇 ...
- Fleury算法求欧拉路径
分析: 小Ho:这种简单的谜题就交给我吧! 小Hi:真的没问题么? <10分钟过去> 小Ho:啊啊啊啊啊!搞不定啊!!!骨牌数量一多就乱了. 小Hi:哎,我就知道你会遇到问题. 小Ho:小 ...
- HihoCoder1181欧拉路(Fleury算法求欧拉路径)
描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角继续往前走,面前出现了一座石桥,石桥的尽头有一道火焰墙,似乎无法通过. 小Hi注意到在桥头有一张 ...
- 欧拉回路 & 欧拉路径
欧拉路径 & 欧拉回路 概念 欧拉路径: 如果图 G 种的一条路径包括所有的边,且仅通过一次的路径. 欧拉回路: 能回到起点的欧拉路径. 混合图: 既有无向边又有无向边的图. 判定 无向图 一 ...
- UVA10054-The Necklace(无向图欧拉回路——套圈算法)
Problem UVA10054-The Necklace Time Limit: 3000 mSec Problem Description Input The input contains T t ...
- The Best Path HDU - 5883(欧拉回路 && 欧拉路径)
The Best Path Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
随机推荐
- Angular2.0 基础: User Input
1.Angular 2.0 中的变量 对输入值的获取,我们可以通过$event 来获取,也可以通过变量来获取. template: ` <input (keyup)="onKey($e ...
- metasploit后门维持技术
在meterpreter中执行:run metsvc -A 如此以后便会自动在服务器当中多生成一个meterpreter的服务,并且是开机自动启动.所以二次如果要利用直接: use exploit/m ...
- Linux 入门记录:十六、Linux 多命令协作:管道及重定向
一.多命令协作 在 Linux 系统当中,大多数命令都很简单,很少出现复杂功能的命令,每个命令往往只实现一个或多个很简单的功能.通过将不同功能的命令组合一起使用,可以实现某个复杂功能的. Linux ...
- python基础===将json转换为dict的办法
首先json是字符串. 大家都知道,字符串是用来传递信息的.json字符串实际上就是一种规定了格式的字符串, 通过这种格式,我们可以在不同的编程语言之间互相传递信息,比如我们可以把javascript ...
- udpserver.pl 和 udpclient.pl
udpserver.pl #!use/bin/perl -w use Socket; #导入Socket库 ,INADDR_ANY);#压入sockaddr_in模式,利用了全局当地压缩地点INADD ...
- CentOS安装按进程实时统计流量情况工具NetHogs笔记
CentOS安装按进程实时统计流量情况工具NetHogs笔记 一.概述 NetHogs是一款开源.免费的,终端下的网络流量监控工具,它可监控Linux的进程或应用程序的网络流量.NetHogs只能实时 ...
- 浮动的div无论窗口大小变化都能居中显示的js
当div是浮动的时候浏览器窗口发生变化的时候不能居中显示(因为浮动的时候一般设定的有left或者right值) 可以先用jquery获取外围的div随浏览器变化而变化的宽度(加上监听事件) 之后再获取 ...
- 线程同步工具 Semaphore类使用案例
参考博文 : 线程同步工具(一) 线程同步工具(二)控制并发访问多个资源 并发工具类(三)控制并发线程数的Semaphore 使用Semaphore模拟互斥锁 当一个线程想要访问某个共享资源,首先,它 ...
- asp.net的Server.MapPath方法
Server.MapPath()的功能: 返回与 Web 服务器上的指定虚拟路径相对应的物理文件路径. 命名空间: System.Web 程序集: System.Web(在 System.Web.dl ...
- Binary Tree Level Order Traversal&&II
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...