[jzoj5840]Miner 题解(欧拉路)

首先考虑第一问。每个联通块的情况是相对独立的,所以可以分别求每个联通块的答案。无向图中存在欧拉路的条件是奇点数为0或2,那么合法方案肯定是tp到一个奇点,通过一条欧拉路到另一个奇点,再tp到另一个奇点……
设共k个联通块,第$i$个里奇点个数为$c_i$,那么答案即为$\sum_{i=1}^k max(1,\frac c2)-1$,最后-1是因为选起点不用浪费传送次数。
关于构造方案,我们先对于每个联通块求它内部的奇点。如果没有的话直接跑欧拉路即可。
如果有奇点,那么必有偶数个,因为每个联通块的点的度数之和必为偶数。可以新建一个源点,向所有奇点连边,再跑欧拉路。
最后的方案输出:
如果从源点到某个点,那这个点一定是奇点,操作为1 x。
从某个点跑到源点,显然不用管。
从点x跑到点y,操作为0 y。
另外,写暴力圈套圈的欧拉路算法还是要用非递归版的,直接dfs有可能爆栈也可能直接T掉(递归很慢)。
#include<cstdio>
#include<iostream>
#include<cstring>
#define pa pair<int,int>
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int N=1e5+5;
int n,m;
int to[N*10],nxt[N*10],head[N],tot=1,deg[N];
int st[N*10],top,vis[N],v[N*10];
int ans=0,cnt;
pa res[N*10];
void add(int x,int y)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
deg[x]++;
}
void dfs(int x)
{
vis[x]=1;
if(deg[x]&1)st[++top]=x;
for(int i=head[x];i;i=nxt[i])
if(!vis[to[i]])dfs(to[i]);
return ;
}
int syst[N*10],systop;
void euler()
{
systop=0;
syst[++systop]=0;
while(systop>0)
{
int x=syst[systop],i=head[x];
while(i&&v[i])i=nxt[i];
if(i)
{
syst[++systop]=to[i];
v[i]=v[i^1]=1;
head[x]=nxt[i];
}
else systop--,st[++top]=x;
}
} int main()
{
n=read();m=read();
for(int i=1;i<=m;i++)
{
int x=read(),y=read();
add(x,y);add(y,x);
}
int ans=0;
for(int i=1;i<=n;i++)
{
if(deg[i]&&!vis[i])
{
top=0;
dfs(i);
head[0]=0;
if(!top)add(0,i),add(i,0),add(i,0),add(0,i);
else while(top){int now=st[top--];add(0,now);add(now,0);};
euler();
int now;
while(top>1)
{
now=st[top--];
if(now)
res[++cnt]=make_pair(0,now);
else res[++cnt]=make_pair(1,st[top--]),ans++;
}
}
}
printf("%d\n%d\n",ans-1,res[1].second);
for(int i=2;i<=cnt;i++)
printf("%d %d\n",res[i].first,res[i].second);
return 0;
}
[jzoj5840]Miner 题解(欧拉路)的更多相关文章
- [CSP-S模拟测试]:Miner(欧拉路)
题目背景 $And\ the\ universe\ said\ you\ are\ the\ daylight \\ And\ the\ universe\ said\ you\ are\ the\ ...
- 【HIHOCODER 1176】 欧拉路·一
描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏.现在他们控制的角色来到了一个很大的湖边.湖上有N个小岛(编号1..N),以及连接小岛的 ...
- 洛谷 P1341 无序字母对 Label:欧拉路 一笔画
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- UVA - 10129Play on Words(欧拉路)
UVA - 10129Play on Words Some of the secret doors contain a very interesting word puzzle. The team o ...
- hdu_5883_The Best Path(欧拉路)
题目链接:hdu_5883_The Best Path 题意: n 个点 m 条无向边的图,找一个欧拉通路/回路使得这个路径所有结点的异或值最大. 题解: 节点 i 的贡献为((du[i] +1/ 2 ...
- 【cf789D】Weird journey(欧拉路、计数)
cf788B/789D. Weird journey 题意 n个点m条边无重边有自环无向图,问有多少种路径可以经过m-2条边两次,其它两条边1次.边集不同的路径就是不同的. 题解 将所有非自环的边变成 ...
- [cf1038E][欧拉路]
http://codeforces.com/contest/1038/problem/E E. Maximum Matching time limit per test 2 seconds memor ...
- POJ 2513 - Colored Sticks - [欧拉路][图的连通性][字典树]
题目链接: http://poj.org/problem?id=2513 http://bailian.openjudge.cn/practice/2513?lang=en_US Time Limit ...
- hdu 5833(欧拉路)
The Best Path Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
随机推荐
- 2019 牛客暑期多校 第二场 H Second Large Rectangle (单调栈)
题目:https://ac.nowcoder.com/acm/contest/882/H 题意:一个大的01矩阵,然后现在要求第二大的全一矩阵是多少 思路:在这里我们首先学习一下另一个东西,怎么求直方 ...
- Ant Design Pro (中后台系统)教程
一.概念:https://pro.ant.design/docs/getting-started-cn(官方网站) 1.Ant Design Pro 是什么: https://www.cnblogs ...
- Redis的高级特性一览
更多内容,欢迎关注微信公众号:全菜工程师小辉.公众号回复关键词,领取免费学习资料. 应用场景 缓存系统:用于缓解数据库的高并发压力 计数器:使用Redis原子操作,用于社交网络的转发数,评论数,粉丝数 ...
- Instagram几个queryhash
page_query_hash 42323d64886122307be10013ad2dcc44comment_query_hash 33ba35852cb50da46f5b5e889df7d159f ...
- appium 链接真机后,运行代码,但是APP并没有启动
要淡定,链接真机后,问题一下多出来这么多,还没有启动程序,就碰到接二连三的问题. 爽到家了.慢慢解决吧. 具体问题是这样的: # coding=utf-8from appium import webd ...
- jenkins-参数化构建插件:Choice Parameter
参考: 谢谢大佬的总结: https://www.cnblogs.com/zhaojingyu/p/9862371.html 使用方式 step1: 添加参数,选择Choice Parameter,并 ...
- Python 进阶_闭包 & 装饰器
目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...
- Iterator,foreach遍历小计
此博客对同一操作对比两种遍历方式,以个人忘记时快速捡起为目的. 数据表: 三个List: List<Menu> menuList=menuService.getAllMenus(query ...
- nginx 虚拟主机+反向代理+负载均衡
nginx是一款免费.开源的http服务器,它是由俄罗斯程序设计师开发的,官方测试,nginx能支撑5万的并发量,主要功能有虚拟主机.反向代理和负载均衡等. nginx配置 # 全局块 ... # e ...
- jmeter中如何使用csv文件并读取数据
我现在要测试一个新的网站,需要负载测试这个功能“加入购物车”.要做到 这一点,我需要模拟多个用户登录并进行购物操作,具体的场景为每一个人将同样的物品加入到购物车. JMeter 处理这些请求完全没有问 ...