[CSP-S模拟测试]:Miner(欧拉路)
题目背景
$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(欧拉路)的更多相关文章
- 星际旅行(欧拉路,欧拉回路)(20190718 NOIP模拟测试5)
瞎搞了一个ans+=du*(du-1)/2 wa20分,好桑心(话外音:居然还有二十分,出题人太周到了) 还是判欧拉路 题解没太仔细想,感觉还是kx的思路明白 具体就是:因为每条边要走两遍,可以把一条 ...
- [CSP-S模拟测试]:组合(欧拉路)
题目传送门(内部题119) 输入格式 第一行,三个整数$T,M,N$. 接下来的$N$行,每行两个整数$u_i,v_i$($i$从$1$开始编号).允许$u_i=v_i$,也允许同样的简单词多次出现. ...
- [CSP-S模拟测试]:星际旅行(欧拉路)
题目传送门(内部题4) 输入格式 第一行两个整数$n,m$,表示行星和虫洞的数量.接下来$m$行,每行两个整数$u,v$,表示存在一个双向虫洞直接连接$u$和$v$.每一个虫洞最多会被描述一次. 输出 ...
- [jzoj5840]Miner 题解(欧拉路)
首先考虑第一问.每个联通块的情况是相对独立的,所以可以分别求每个联通块的答案.无向图中存在欧拉路的条件是奇点数为0或2,那么合法方案肯定是tp到一个奇点,通过一条欧拉路到另一个奇点,再tp到另一个奇点 ...
- SGU 101.Domino (欧拉路)
时间限制: 0.5 sec 空间限制: 4096 KB 描述 多米诺骨牌,一种用小的方的木块或其他材料,每个都被一些点在面上标记,这些木块通常被称为骨牌.每个骨牌的面都被一条线分成两个 方形,两边 ...
- hiho一下 第四十九周 题目1 : 欧拉路·一【无向图 欧拉路问题】
题目1 : 欧拉路·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最 ...
- 洛谷P1341 无序字母对[无向图欧拉路]
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- Android单元测试与模拟测试详解
测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...
- [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)
目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...
随机推荐
- indexOf与includes的区别
indexOf与includes的区别:https://blog.csdn.net/gtLBTNq9mr3/article/details/78700118 includes和indexOf相比较:相 ...
- mysql中列转行
通过group_concat()函数来实现 select group_concat(name) from table group by type select group_concat(name se ...
- 线段树(two value)与树状数组(RMQ算法st表)
士兵杀敌(三) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比 ...
- Spacemacs 的配置
Spacemacs 的配置 */--> Spacemacs 的配置 Table of Contents 1. 安利 2. 安装 3. layer 4. 自带的 layer 5. better-e ...
- Spring Data Redis实战之提供RedisTemplate
参考: http://www.cnblogs.com/edwinchen/p/3816938.html 本项目创建的是Maven项目 一.pom.xml引入dependencies <depen ...
- pycharm修改字体大小和主题
一,修改文字大小: 二,修改主题:你可能对编辑器的外观仍不满意,例如你希望将文档字符串改变为另外一种颜色,下面介绍具体更改方法:
- 剑指offer学习--初级c++面试题
定义一个空的类型,里面没有任何成员函数和成员变量,对该类型求sizeof,得到的结果是多少? 答案是1.空类型中的实例中不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例的时候,他 ...
- 毕设问题(2) fastjson 的过滤器使用(SSH hibernate)以及转换对象出现 $ref
毕业设计,用SSH框架,但是想要做出异步请求数据的效果,使用了ajax方式,其中数据传递的类型为json.ajax使用用的jQuery的ajax.其实struts里也支持ajax功能,但是我觉得用太多 ...
- java Scanner输入数字、字符串
package java05; import java.util.Scanner;//1.导包 /* Scanner类的功能,可以实现键盘输入数据,到程序当中 引用类型的一班使用步骤: 1.导包 2. ...
- [BZOJ4278] [ONTAK2015]Tasowanie 贪心+后缀数组
题目链接 最近做题目好像有点东一榔头西一棒.好吧其实订正模拟题的时候需要用到什么感觉不太熟的就写一下吧. 显然直接贪心,比较两个点后面的串的字典序,小就选谁就可以了. 可以把两个串接起来,加一个\(i ...