[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 ...
随机推荐
- Android Studio使用tips
安装位置:C:\Users\xxx\AppData\Local\Android\sdk https://developer.android.com/topic/libraries/support-li ...
- [CSP-S模拟测试]:密码(AC自动机+DP)
题目传送门(内部题19) 输入格式 第一行两个正整数$n,k$,代表秘钥个数和要求.接下来两个正整数$x$和$y$,意义如题所述.接下来$n$行,每行一个正整数,意义如题所述. 输出格式 一个正整数, ...
- ArrayList和Map的一些知识
2014年10月17日16:39:01 1.如何获取某条数据在ArrayList中的索引值? 多个对象存储的ArrayList中,如果只知道对象其中的一个属性,如何获取该对象在ArrayList里的索 ...
- Windwos 08R2_DNS+AD安装图文
目录 目录 前言 软件环境 DNS域名服务器 配置DNS服务器 AD活动目录 配置AD域 前言 Windows 2008 R2平台下搭建AD(Active Directory)和DNS(Domain ...
- flask实现异步任务
最近在开发同步mysql数据到redis的接口,因为数据同步涉及各种增删查改,如果用同步实现,可能回造成连接超时.堵塞,所以,使用python实现异步任务. 代码实现from flask import ...
- CF560补题
D题:用来对比的vector<long long> b不能被初始化大小成n,因为a里面有n个因子,但是这是可能存在遗漏情况的.如果刚好是遇到实际因子远多于n,那么就会在运行过程中出错. 还 ...
- centos7 安装 gitlab 服务器
https://www.cnblogs.com/wenwei-blog/p/5861450.html 标签: centos7 git安装 git gitlab 我这里使用的是centos 7 64bi ...
- sourcetree配置gitlab
一.准备 1.安装git,下载地址:https://git-scm.com/download 安装教程百度一下 git客户端(1.产生gitlab服务端和本地git相互传输时所需要校验的私钥 ...
- 路由参数 query和params
1. path:'www.baidu.com' query { id:122 } 对应地址:http:'www.baidu.coom?id=122' 类似get方式 2.name:'baidu' ...
- 45.Sort List(链表排序)
Level: Medium 题目描述: Sort a linked list in O(n log n) time using constant space complexity. Example ...