[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直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...
随机推荐
- 使用Atom写你的笔记
使用Atom写你的笔记 本文参考简书笔记. 使用sync-settings同步你的Atom设置 使用sync-settings插件需要以下3个条件: 电脑已安装Atom Atom内已安装sync-se ...
- Visual Studio中把文件夹导入工程中
VS用到的功能还是太少,记录备忘. 有的时候需要把其他库的源码导入当前工程直接使用,而这个库是源码形式,又带很多目录的. 之前从没遇到过这种情况,自己的库目录自己新建,添加. 第三方库一般有单独的Pr ...
- 学习Spring IOC控制反转和DI依赖注入总结
30岁的小曹,20岁的身体,还在坚持在能力允许控制范围内22点睡觉,5点起床锻炼身体,好好学习,除了加班或者像今天这样的深夜,再一次写已经有X百万人写过的 spring Ioc 的总结博客. 一.IO ...
- Maximum Subarray(最大连续子序列和)
https://leetcode.com/problems/maximum-subarray/ 思路: 如果全为负值,那么取最大值 如果有非负值,那么我们依次计算到当前位置为止的最大值.假设有n个元素 ...
- [Python3] 023 面向对象 第三弹
目录 7. 类相关函数 8. 类的成员描述符(属性) 9. 类的内置属性 10. 类的常用魔术方法 10.1 操作类 10.2 描述符 10.3 属性操作 10.4 运算分类相关魔术方法 接上一篇 [ ...
- 小B的询问(题解)(莫队)
小B的询问(题解)(莫队) Junlier良心莫队 题目 luoguP2709 小B的询问 code #include<bits/stdc++.h> #define lst long lo ...
- C# PDF文件转图片
参考:https://blog.csdn.net/lai124793549/article/details/53392281 https://www.cnblogs.com/xiewei123/p/1 ...
- redis学习(二)
简单了解一下 1.build.gradle中添加 依赖 org.springframework.boot:spring-boot-starter-data-redis //定义依赖:声明项目中需要哪 ...
- CSS-06 外部JS,CSS文件的寻址问题
如果js.css外部文件有使用到相对路径,其相对路径的基准是不一样的 当一个index.html中引入外部的JS和CSS文件时: 在index.css文件中,相对路径的写法是以css文件相对于img图 ...
- 使用EntityFramework调用存储过程并获取存储过程返回的结果集
[实习]刚入职,公司要求完成两个任务,任务要求使用存储过程和事务,其中一个问题要获取存储过程的查询结果集.经过多方查找和自己的实践,终于找到了方法.这里记录一下. 看到的这篇文章中给出的例子是查询单个 ...