lth tql,lzpclxf tql Orz

Problem 2 旅行计划 (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=;
vector<int> ans[N];
int T,n,m,tot=,head[N],vis[N],in[N],cnt;
struct node {
int to,nex,flag,id;
} a[N>>];
inline int read() {//快读
int x=,f=;
char ch=getchar();
while(ch<''||ch>'') {
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
x=(x<<)+(x<<)+(ch^),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=;
a[tot].id=id;
head[x]=tot;
}
void dfs(int x) {
vis[x]=;
for(int i=head[x]; i; i=a[i].nex) {
int y=a[i].to,emm=a[i].flag;
if(!emm) {
a[i].flag=a[i^].flag=;
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--) {
for(int i = ; i <= cnt; i ++) ans[i].clear();
tot=,cnt=;
memset(head,,sizeof(head));
memset(vis,,sizeof(vis));
memset(in,,sizeof(in));//多组数据注意清空数组
n=read();
m=read();
for(int i=,x,y; i<=m; i++) {
x=read();
y=read();
add(x,y,i);
add(y,x,-i);
in[x]++,in[y]++;
}
int now=;
for(int i=; i<=n; i++)
if(in[i]%==) {
if(now) {
add(i,now,);
add(now,i,);
now=;
} else now=i;
}
for(int i=; i<=n; i++)
if(!vis[i]&&in[i]%) {
cnt++;
dfs(i);
cnt--;//回溯
}
for(int i=; i<=n; i++)
if(!vis[i]&&in[i])
cnt++,dfs(i);
//输出
printf("%d\n",cnt - );
for(int i=; i<=cnt; i++) {
printf("%d ",ans[i].size());
for(int j=; j<ans[i].size(); j++)
printf("%d ",ans[i][j]);
printf("\n");
}
printf("\n");
}
// fclose(stdin);
// fclose(stdout);
return ;
}

Problem 2 旅行计划 (travelling .cpp)———2019.10.6的更多相关文章

  1. 【csp模拟赛4】旅行计划 (travelling.cpp)--欧拉回路

    [题目描述] 小 Z 打算趁着暑假,开启他的旅行计划.但与其他同学不同的是,小 Z 旅 行时并不关心到达了哪个网红景点打了哪些卡.小 Z 更关注沿路的风光,而且 小 Z 觉得,尽管多次到达同一个地方, ...

  2. Problem 1 珠江夜游 (cruise .cpp)———2019.10.6

    Problem 1 珠江夜游 (cruise.cpp)[题目描述]小 Z 放假后难得来一趟广州游玩,当然要吃遍广州各路美食小吃然后再到珠江新城看看远近闻名的小蛮腰啦!可当小 Z 一路吃吃吃以后,天渐渐 ...

  3. Problem 3 基站建设 (station.cpp)———2019.10.6

    在此郑重的感激wxyww大佬 wxyww tql [题目描述]小 Z 的爸爸是一位通信工程师,他所在的通信公司最近接到了一个新的通信工程建设任务,他们需要在 C 城建设一批新的基站.C 城的城市规划做 ...

  4. Crash的旅行计划

    除草了.. Crash的旅行计划 [问题描述] 过不了多久,Crash就要迎来他朝思暮想的暑假.在这个暑假里,他计划着到火星上旅游.在火星上有N个旅游景点,Crash用1至N这N个正整数对这些景点标号 ...

  5. Problem B. Market(market.c/cpp/pas)

    Problem B. Market(market.c/cpp/pas)Time limit: 1 secondsMemory limit: 128 megabytes在比特镇一共有 n 家商店,编号依 ...

  6. COGS 2. 旅行计划

    2. 旅行计划 ★☆   输入文件:djs.in   输出文件:djs.out   简单对比时间限制:3 s   内存限制:128 MB 过暑假了,阿杜准备出行旅游,他已经查到了某些城市的两两之间的距 ...

  7. 【51Nod】1273 旅行计划 树上贪心

    [题目]51Nod 1273 旅行计划 [题意]给定n个点的树和出发点k,要求每次选择一个目的地旅行后返回,使得路径上未访问过的点最多(相同取编号最小),旅行后路径上所有点视为访问过,求旅行方案.\( ...

  8. 模拟赛 Problem 2 不等数列(num.cpp/c/pas)

    Problem 2 不等数列(num.cpp/c/pas) [题目描述] 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”.问在所有排列中,有多少个排列恰好有 ...

  9. 【2019.10.17】十天Web前端程序员体验(软件工程实践第五次作业)

    结对信息.具体分工 Github地址:https://github.com/MokouTyan/131700101-031702425 学号 昵称 主要负责内容 博客地址 131700101 莫多 代 ...

随机推荐

  1. ThreadLocal使用场景案例

    本篇是<ThreadLocal 那点事儿>的续集,如果您没看上一篇,就就有点亏了.如果您错过了这一篇,那亏得就更大了. 还是保持我一贯的 Style,用一个 Demo 来说话吧.用户提出一 ...

  2. IP地址和MAC地址绑定的必要性

    计算机网络是一个共通的网络,世界上任何计算机都可以互相访问. 实现的原理基于网络通讯的互联网交互五层模型. 计算机网络的历史发展 当计算机网络技术初始利用的时代,几台计算机通过集线器连接,就可以实现网 ...

  3. Vue传递方法给页面调用

    很多人在使用vue的时候苦于在vue中写方法,但是在外部甚至在另一个js该如何调用呢? 这个方法就是显示了vue的可以传递方法到页面使得页面任何地方都可以调用 前提得引用文件 这个方法一般多用于加载周 ...

  4. 2019 草花手游java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.草花手游等公司offer,岗位是Java后端开发,因为发展原因最终选择去了草花手游,入职一年时间了,也成为了面 ...

  5. CDH5.14.4中的Hue集成HBase

    1.进入CDH中的给HBase添加Thrift Server角色实例, 为了方便, 将Thrift Server添加到Hue同一主机 2.HBase Thrift Server中选择主机cm1: 3. ...

  6. VUE组件3 数据流和.sync修饰符

    单向数据流:数据通过prop从父组件传递到子组件中,当父级组件中的数据更新时,传子组件也会更新,但不能在子组件中修改.防止子组件在无意中修改,改变父级组件状态 然而,双向数据绑定在某些情况下有用.如果 ...

  7. Web消息推送框架windows部署实践

    一.官方下载地址:https://www.workerman.net/web-sender 二.解压至任意目录下,双击start_for_win.bat,效果如下图: 三.打开Chrome浏览器访问: ...

  8. 英语orientaljasper鸡血石orientaljasper单词

    鸡血石(orientaljasper),是辰砂条带的地开石,因鲜红色似鸡血的辰砂(朱砂)而得名.鸡血石含有辰砂(朱砂).石英.玉髓35%-45%.磁铁矿.赤铁矿6%-12%.辰砂约5%-8%. 鸡血石 ...

  9. python递归函数的执行过程

    举例: def nove(n,a,b,c): if n == 1: print(a,'------------>',c) else: nove(n-1,a,c,b) nove(1,a,b,c) ...

  10. git 检索

    图形化客户端:sourcetree下载: https://www.sourcetreeapp.com/安装: 由于种种不可描述的原因,无法注册账号且无法登陆所以需要绕过登陆绕过登陆: 去到 C:\Us ...