题目背景

$And\ the\ universe\ said\ you\ are\ the\ daylight \\ And\ the\ universe\ said\ you\ are\ the\ night \\ And\ the\ universe\ said\ the\ darkness\ you\ fight\ is\ within\ you \\ And\ the\ universe\ said\ the\ light\ you\ seek\ is\ within\ you$


题目描述

在$Minecraft$中,小$C$最喜欢做的工作就是挖矿,但他从不自己挖矿洞,因为这样每挖不久就会遇到铁矿挡到面前,而小$C$是不屑于打铁的;于是他总是利用天然矿洞,但这样很容易迷路或者走到重复的路径,降低了他收割$Au$的效率,于是他希望对路径进行规划。
    在小$C$的眼里,矿洞是一个$n$个点的无向图,其中有$m$条无向通道连接。小$C$可以从任选一个起点开始,进行一下操作中的一个:
    $0\ v$,选择一条相邻的还未经过的通道走到$v$。
    $1\ v$,利用修改器,直接传送到任意一个点$v$。
    小$C$希望在经过的所有通道恰好一次的前提下,最小化传送的次数。输出这个最小次数,并给出任意一个最优方案。


输入格式

第一行两个整数$n,m$,接下来$m$行,每行两个整数描述一条无向边。


输出格式

首先输出一个整数表示答案$ans$。
接下来一行,输出你选择的起点$S$。
接下来$ans+m$行,每行两个证书描述一个操作,格式见问题描述。


样例

样例输入:

5 4
1 2
1 2
3 4
5 5

样例输出:

2
1
0 2
0 1
1 3
0 4
1 5
0 5


题解

题意就是加上尽量少的边,使图中存在欧拉路径;也就使用尽量少的路径,覆盖所有边恰好一次,假设途中有$k$个联通块,第$i$个中有$c_i$个度数为奇数的点,那么答案为:$\sum \limits_{i=1}^k\max(1,\frac{c_i}{2})-1$。
    构造方法也很简单,将度数为奇数的点任意配对连额外的边,然后每个联通块跑欧拉回路,额外连的边将回路割成若干段路径,这些路径之间以及联通块之间用$1$操作跳即可。

时间复杂度:$\Theta(n+m)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
struct rec
{
int nxt;
int to;
}e[1000001];
int head[100001],cnt=1;
int n,m;
int du[100001];
bool vis[100001],vib[1000001];
int sta[1000001],wzc[1000001];
long long sum,cmax;
long long ans=-1;
int tot;
pair<int,int> pos[1000001];
void add(int x,int y)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
head[x]=cnt;
}
void dfs(int x)
{
vis[x]=1;
if(du[x]&1)sta[++sta[0]]=x;
for(int i=head[x];i;i=e[i].nxt)
if(!vis[e[i].to])dfs(e[i].to);
}
void ola(int x)
{
wzc[0]=1;
wzc[1]=x;
while(wzc[0])
{
nxt:x=wzc[wzc[0]];
for(int i=head[x];i;i=e[i].nxt)
if(!vib[i])
{
vib[i]=vib[i^1]=1;
wzc[++wzc[0]]=e[i].to;
head[x]=e[i].nxt;
goto nxt;
}
sta[++sta[0]]=x;
wzc[0]--;
}
}
int main()
{
scanf("%d%d",&n,&m);
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
du[x]++;
du[y]++;
}
for(int i=1;i<=n;i++)
if(!vis[i]&&du[i])
{
sta[0]=0;
dfs(i);
head[0]=0;
if(!sta[0])
{
add(i,0);
add(i,0);
add(0,i);
add(0,i);
}
else
while(sta[0])
{
add(sta[sta[0]],0);
add(0,sta[sta[0]--]);
}
ola(0);
while(sta[0]>1)
if(sta[sta[0]])pos[++tot]=make_pair(0,sta[sta[0]--]);
else
{
sta[0]--;
pos[++tot]=make_pair(1,sta[sta[0]--]);
ans++;
}
}
printf("%d\n%d\n",ans,pos[1].second);
for(int i=2;i<=tot;i++)
printf("%d %d\n",pos[i].first,pos[i].second);
return 0;
}

rp++

[CSP-S模拟测试]:Miner(欧拉路)的更多相关文章

  1. 星际旅行(欧拉路,欧拉回路)(20190718 NOIP模拟测试5)

    瞎搞了一个ans+=du*(du-1)/2 wa20分,好桑心(话外音:居然还有二十分,出题人太周到了) 还是判欧拉路 题解没太仔细想,感觉还是kx的思路明白 具体就是:因为每条边要走两遍,可以把一条 ...

  2. [CSP-S模拟测试]:组合(欧拉路)

    题目传送门(内部题119) 输入格式 第一行,三个整数$T,M,N$. 接下来的$N$行,每行两个整数$u_i,v_i$($i$从$1$开始编号).允许$u_i=v_i$,也允许同样的简单词多次出现. ...

  3. [CSP-S模拟测试]:星际旅行(欧拉路)

    题目传送门(内部题4) 输入格式 第一行两个整数$n,m$,表示行星和虫洞的数量.接下来$m$行,每行两个整数$u,v$,表示存在一个双向虫洞直接连接$u$和$v$.每一个虫洞最多会被描述一次. 输出 ...

  4. [jzoj5840]Miner 题解(欧拉路)

    首先考虑第一问.每个联通块的情况是相对独立的,所以可以分别求每个联通块的答案.无向图中存在欧拉路的条件是奇点数为0或2,那么合法方案肯定是tp到一个奇点,通过一条欧拉路到另一个奇点,再tp到另一个奇点 ...

  5. SGU 101.Domino (欧拉路)

    时间限制: 0.5 sec 空间限制: 4096 KB 描述 多米诺骨牌,一种用小的方的木块或其他材料,每个都被一些点在面上标记,这些木块通常被称为骨牌.每个骨牌的面都被一条线分成两个   方形,两边 ...

  6. hiho一下 第四十九周 题目1 : 欧拉路·一【无向图 欧拉路问题】

    题目1 : 欧拉路·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最 ...

  7. 洛谷P1341 无序字母对[无向图欧拉路]

    题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...

  8. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  9. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

随机推荐

  1. Oracle系列:触发器、作业、序列、连接

    .Net程序员学用Oracle系列(8):触发器.作业.序列.连接   1.触发器 2.作业 2.1.作业调度功能和应用 2.2.通过 DBMS_JOB 来调度作业 3.序列 3.1.创建序列 3.2 ...

  2. PTA 1121 Damn Single

    题目链接:1121 Damn Single (25 分) "Damn Single (单身狗)" is the Chinese nickname for someone who i ...

  3. Hexo-博客yilia主题创建分类(categories)和标签(tags)首页

    转载自:http://orzcss.com/posts/5a207d64/ 概述 默认安装的 hexo 本身是没有分类和标签首页的,例如:http://orzcss.com/categories/页面 ...

  4. 搭建用例管理平台phpstudy+testlink代替Apache+MySQL+PHP环境,以及testlink搭建环境报错修复

    公司需要搭建一个用例管理平台,环境搭建Apache+MySQL+PHP环境 哇一看就是需要花很长时间去搭建环境,本来我也在用这样的笨方法,不小心被公司开发看到,经人家一提点,哎呀妈呀发现自己以前的方法 ...

  5. java--反射原理及操作

    1.反射原理 反射具体操作 15.反射的原理(********理解********) * 应用在一些通用性比较高的代码 中 * 后面学到的框架,大多数都是使用反射来实现的 * 在框架开发中,都是基于配 ...

  6. javaweb的Filter过滤器设置全站编码

    FIlter配置全站编码有一种方法是重写getParameter方法,也就是继承HttpServletRequestWrapper在重写getParameter方法,还有一种就是如下: public ...

  7. 高德地图POI采集(URL-API)

    新手从零学起,成功跑通,记一下,技术大神们多多指点. ———————————————— 1-概述 POI:兴趣点.对于百度.高德等电子地图来说,一个POI是地图上的一个店铺/商场/小区等等. 这次要解 ...

  8. POJ-1611.TheSuspects.(并查集)

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 55832   Accepted: 26501 De ...

  9. python安装numpy

    命令介绍: D:\computerSoft\python3.6.4\Scripts>python36 pip3.6.exe install numpy # 通过pip下载对应版本的numpy,然 ...

  10. hdu 4453 约会安排(线段树区间合并)

    约会安排 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...