【csp模拟赛4】旅行计划 (travelling.cpp)--欧拉回路
【题目描述】
小 Z 打算趁着暑假,开启他的旅行计划。但与其他同学不同的是,小 Z 旅 行时并不关心到达了哪个网红景点打了哪些卡。小 Z 更关注沿路的风光,而且 小 Z 觉得,尽管多次到达同一个地方,但如果来时的路不一样,也是别有一番 风味。 小 Z 事先准备了一份地图,地图上给出了 N 个小 Z 心仪的城市,依次编号 1…N,以及 M 条连接两个城市的路,编号 1…M。小 Z 打算把 M 条路都走一遍且 仅一遍,但他发现这样的路线可能是不存在的。于是他打算,当他走到一个城 市后发现从这个城市出发的道路他都已经走过了,他便会坐飞机到另一个城市, 然后继续他的旅行。 现在小 Z 想知道,在最好的路线计划下,他至少要坐多少趟飞机。
【输入格式】
第一行为测试数据组数 T(1≤T≤10)。 每组测试数据的第一行为城市数 N 及道路数 M。 接下来 M 行,每行两个整数 x 和 y,表示一条连接城市 x 和城市 y 的双向 道路。
【输出格式】
对于每组测试数据,输出第一行包含一个整数 K,表示小 Z 至少要坐多少 趟飞机。 接下来 K+1 行,第 i 行输出小 Z 的第 i 段行程。若第 i 段行程经过 x 条道 路,则先输出 x,然后输出 x 个整数,分别表示路线经过的道路的编号。若是 正向通过第 i 条道路,则输出 i,否则输出-i。 若有多组方案,输出任意一组。
【样例输入】
1
3 3
1 2
1 3
2 3
【样例输出】
0 3 1 3 -2
解法:每个连通块显然是独立的。对于一个连通块(除了单个点的),如果奇度数点个数 为 k,那么至少需要 max(k/2,1)条路径。这是因为在一个无向图中,将两个度数为奇数的 点连起来,就可以消去两个奇数点。所以如果一个无向图要有欧拉回路(全部点的度数全 为偶数),只要加 k/2 条边就可以了。于是乎,我们只要将一个连通块变成欧拉图,搜一 遍得到路径,再将我们人为添加的边删掉,剩下的就是这个连通块的"笔画"了。 这里为什么一定变成欧拉回路而不是欧拉通路,其实这里欧拉回路和欧拉通路都是 可以的,得到的答案是一样的。主要是算法实现上的问题,如果变成欧拉通路,就一定得 从剩下的两个奇数点出发,终止。至于为什么这里加 k/2 条边后扫出的结果删掉多加的边 就是答案,并且这个答案=max(k/2,1)呢?这是因为一个图中,我们从奇数点开始走,停止 的也一定是在奇数点,那么再一遍遍不重复地从图中走出一条条类似前面地路径(奇数点 开始,奇数点结束)然后我们将这些路径地终点连接下一条路径的起点(多加的边),这样又 因为每一条路径的起止点都为奇数点,一条边删去两个奇数点。所以最终把他们连成欧拉 回路所需的边的数量就是 k/2。
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int N = 100005;
vector<int> ans[N];
int T,n,m,tot = 1,head[N],vis[N],in[N],cnt;
struct node{
int to,nex,flag,id;
}a[N * 4];
inline int read()
{
int x = 0,f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-')f = -1;ch = getchar();}
while(ch >= '0' && ch <= '9'){x = (x << 3) + (x << 1) + (ch ^ 48);ch = getchar();}
return x * f;
}
void add(int x,int y,int id)
{
a[++ tot].to = y;
a[tot].nex = head[x];
a[tot].flag = 0;
a[tot].id = id;
head[x] = tot;
}
void dfs(int x)
{
vis[x] = 1;
for(int i = head[x];i;i = a[i].nex)
{
int y = a[i].to,em = a[i].flag;
if(!em)
{
a[i].flag = a[i ^ 1].flag = 1;
dfs(y);
if(a[i].id) ans[cnt].push_back(- a[i].id);
else cnt ++;
}
}
}
int main()
{
freopen("travelling.in","r",stdin);
freopen("travelling.out","w",stdout);
T = read();
while(T -- > 0)
{
for(int i = 1;i <= cnt;i ++) ans[i].clear();
tot = 1; cnt = 0;
memset(head,0,sizeof(head));
memset(vis,0,sizeof(vis));
memset(in,0,sizeof(in));
n = read();m = read();
for(int i = 1,x,y;i <= m;i ++)
{
x = read();y = read();
add(x,y,i); add(y,x,-i);
in[x] ++;in[y] ++;
}
int now = 0;
for(int i = 1;i <= n;i ++)
if(in[i] % 2 == 1)
{
if(now)
{
add(i,now,0);
add(now,i,0);
now = 0;
}
else now = i;
}
for(int i = 1;i <= n;i ++)
if(!vis[i] && in[i] % 2)
{
cnt ++;
dfs(i);
cnt --;
}
for(int i = 1;i <= n;i ++)
if(!vis[i] && in[i])
cnt ++,dfs(i);
printf("%d\n",cnt - 1);
for(int i = 1;i <= cnt;i ++)
{
printf("%d ",ans[i].size());
for(int j = 0;j < ans[i].size();j ++)
printf("%d ",ans[i][j]);
printf("\n");
}
printf("\n");
}
fclose(stdin);
fclose(stdout);
return 0;
}
/*
1
3 3
1 2
1 3
2 3
*/
【csp模拟赛4】旅行计划 (travelling.cpp)--欧拉回路的更多相关文章
- Problem 2 旅行计划 (travelling .cpp)———2019.10.6
lth tql,lzpclxf tql Orz Problem 2 旅行计划 (travelling.cpp)[题目描述]小 Z 打算趁着暑假,开启他的旅行计划.但与其他同学不同的是,小 Z 旅行时并 ...
- CSP模拟赛游记
时间:2019.10.5 考试时间:100分钟(连正式考试时间的一半还没有到)题目:由于某些原因不能公开. 由于第一次接触NOIinux系统所以连怎么建文件夹,调字体,如何编译都不知道,考试的前半小时 ...
- 【csp模拟赛4】 珠江夜游 (cruise.cpp)-二分,贪心
Problem 1 珠江夜游 (cruise.cpp) [题目描述] 小 Z 放假后难得来一趟广州游玩,当然要吃遍广州各路美食小吃然后再 到珠江新城看看远近闻名的小蛮腰啦!可当小 Z 一路吃吃吃以后, ...
- 【csp模拟赛4】基站建设 (station.cpp)
[题目描述] 小 Z 的爸爸是一位通信工程师,他所在的通信公司最近接到了一个新的通 信工程建设任务,他们需要在 C 城建设一批新的基站. C 城的城市规划做得非常好,整个城市被规整地划分为 8 行 8 ...
- 【csp模拟赛5】限制 (restrict.cpp)--数学
自己看吧: 爆搜代码: //春水初涨-春林初盛-春风十里-不如你 //----hzwer // 这是啥子题,读不懂-- //题意有问题 -- #include<iostream> #inc ...
- 【csp模拟赛5】购物(shopping.cpp)--常规
多项式,因为每次的x相同,所以把a和b相加就行了,然后找对称轴,找离对称轴最近的整数点,然而我却写了个暴力,没看x #include <iostream> #include <cst ...
- 【csp模拟赛1】铁路网络 (network.cpp)
[题目描述] 在暑假来临之际,小 Z 的地理老师布置了一个暑假作业,让同学们暑假期间 了解一下 C 国的铁路发展史.小 Z 在多番查证资料后发现,C 国在铁路发展初期, 铁路网络有着一个严密规整的结构 ...
- 【csp模拟赛1】不服来战 (challenge.cpp)
[题目描述] 最近小 Z 和他的朋友都迷上了一款手机游戏:不服来战. 游戏的设定十分简单,在游戏开始时,会给出一排共 N 个灯,有的灯是开着 的有的是关着的,每个灯都有一个分数.而玩家可以进行任意次操 ...
- 【CSP模拟赛】Freda的迷宫(桥)
题目描述 Freda是一个迷宫爱好者,她利用业余时间建造了许多迷宫.每个迷宫都是由若干房间和走廊构成的,每条走廊都连接着两个不同的房间,两个房间之间最多只有一条走廊直接相连,走廊都是双向通过. 黄昏 ...
随机推荐
- axios拦截器的介绍
interceptors 拦截器 拦截器一般做什么? 1. 修改请求头的一些配置项 2. 给请求的过程添加一些请求的图标 3. 给请求添加参数 拦截器的基本语法: 拦截器分为全局拦截器和局部拦截器 全 ...
- Python基础总结之第六天开始【先简单认识一次函数】(新手可相互督促)
午休后,看看电视,在回顾下新的知识----函数.相信很多小伙伴在学习python后 ,学到函数就会有一部分人放弃了,从努力到放弃(内容过于真实) 好希望我也能有很多粉丝,hhh.... 函数: 什么是 ...
- 编写程序来实现实现strcat()功能
strcat(字符数组1,字符串2) 字符串2的内容复制连接在字符数组1的后面,其返回值为字符数组1的地址 /* strcat(字符数组1,字符串2) 字符串2的内容复制连接在字符数组1的后面,其返回 ...
- Scala学习十八——高级类型
一.本章要点 单例类型可用于方法串接和带对象参数的方法 类型投影对所有外部类的对象都包含了其他内部类的实例 类型别名给类型指定一个短小的名称 结构类型等效于”鸭子类型“ 存在类型为泛型的通配参数提供了 ...
- Jmeter4.0---- 测试数据说明(17)
1.说明 jmeter工具对于请求的测试结果,有多种形式展现,但是数据比较难懂,现在针对不同的展现做具体的说明. 2.监听器 (一)图形结果 (1)样本数目:总共发到服务器的请求数 (2)最新样本:服 ...
- set-cookie中的SameSite属性
原文:set-cookie中的SameSite属性 再见,CSRF:讲解set-cookie中的SameSite属性 2016-04-14 13:18:42 来源:360安全播报 作者:暗羽喵 阅读: ...
- wrbstrom使用
使用webstrom时遇到Firefox浏览器打不开问题,是webstrom未找到你Firefox的安装路径下面为大家提供解决方法: 文件--->设置--->工具--->web浏览器 ...
- 使用lodop.js打印控件打印table并分页等
import {getLodop} from '@/utils/LodopFuncs.js' //打印表格 export default{ // num 打印还是打印预览 conData 对象形式 传 ...
- JDK,JRE,JVM 关系和概念
JDK : Java Development ToolKit(Java开发工具包).JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工 ...
- ARM与x86 CPU架构对比
CISC(复杂指令集计算机)和RISC(精简指令集计算机)是当前CPU的两种架构.它们的区别在于不同的CPU设计理念和方法.早期的CPU全部是CISC架构,它的设计目的是CISC要用最少的机器语言指令 ...