[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直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...
随机推荐
- C++ 测量程序执行时间的办法
#include <time.h> clock_t start = clock(); //时间起始 /*待测试代码*/ clock_t end = clock(); //时间测试结束 co ...
- Spring自动装配之依赖注入(DI)
依赖注入发生的时间 当Spring IOC 容器完成了Bean 定义资源的定位.载入和解析注册以后,IOC 容器中已经管理类Bean定义的相关数据,但是此时IOC 容器还没有对所管理的Bean 进行依 ...
- mybatis报错:org.apache.ibatis.builder.BuilderException:Encountered " "shr" "shr " " at line 1,column 1
程序报错如下: 解决:变量名冲突 表字段‘审核人’简称为shr,与mybatis的OGNL表达式发生冲突. 解决方法:修改冲突的变量名即可. 总结了一下变量命名可能发生冲突的变量集合: bor(字符| ...
- JAVA线程同步通信
以下讲解Lock线程同步通信,也是比synchronized强大的一个功能点 先看一个常规的案例: 用户类 public class Person { public void eat(){ for(i ...
- hive 排序
1.全局排序(order by) Order by:全局排序,只有一个reducer ASC(ascend):升序(默认) DESC(descend):降序 2.每个MR内部排序(sort by) s ...
- 实现自己的DiscoveryClient
需要做的: DiscoveryClient能提供那些服务的服务名列表 返回指定服务对于的ServiceInstance列表 返回DiscoveryClient的顺序 返回HealthIndicator ...
- [Bzoj1030][JSOI2007]文本生成器(AC自动机&dp)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1030 最最最常见的多串匹配问题!题目求至少包含一个子串的方案数,则可以转化成全部方案-不 ...
- [Codeforces 464E] The Classic Problem(可持久化线段树)
[Codeforces 464E] The Classic Problem(可持久化线段树) 题面 给出一个带权无向图,每条边的边权是\(2^{x_i}(x_i<10^5)\),求s到t的最短路 ...
- 问题处理——"无法导航到插入符号下的符号"
最近编码时经常发现"转到定义"功能没法用了,代码一片灰.刚开始时重新编译一下项目或重启一下VS就恢复了,但到后面这两种方法都不管用了. 偶然下发现解决方案中很多项目的引用都出现了黄 ...
- Vue PC端图片预览插件
*手上的项目刚刚搞完了,记录一下项目中遇到的问题,留做笔记: 需求: 在项目中,需要展示用户上传的一些图片,我从后台接口拿到图片url后放在页面上展示,因为被图片我设置了宽度限制(150px),所以图 ...