正题

题目链接:https://www.luogu.com.cn/problem/CF453C


题目大意

nnn个点mmm条边的一张无向图,每个节点有一个wiw_iwi​表示该点需要经过奇数/偶数次。

求一条满足条件的长度不超过4n4n4n的路径

1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105


解题思路

一个结论就是一棵树是一定有解的,出了起终点每个点有入有出,如果每个点的入和出视为点的话拿去树上匹配,因为是联通图显然能够匹配并且一个点的入次数不会超过儿子个数*2+1次(好像是),这样总共次数就不会超过限制。

判无解的话就是如果有两个或以上包含奇数点的联通块就无解。

然后考虑怎么构造树的方案,把思路放在局部方面,如果一个点走完儿子它不满足条件它就需要多走一次,我们之间走到父节点然后再走回来。

此时不会影响儿子的答案并且父节点在后面还可以再进行调整。

但是根节点无法调整,不难发现我们还有一个可以使用,因为没有限制终点一定要回到根,所以我们可以最后一次不回溯到根节点就好了

时间复杂度O(n)O(n)O(n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1e5+10;
struct node{int to,next;
}a[N<<1];
int n,m,tot,w[N],ls[N],v[N];
queue<int> q;bool flag;
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(int x){v[x]=1;flag|=w[x];for(int i=ls[x];i;i=a[i].next)if(!v[a[i].to])dfs(a[i].to);return;
}
void solve(int x){q.push(x);w[x]^=1;v[x]=1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(v[y])continue;solve(y);if(w[y]){q.push(x);q.push(y);w[x]^=1;}q.push(x);w[x]^=1;}return;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);}for(int i=1;i<=n;i++)scanf("%d",&w[i]);int cnt=0;for(int i=1;i<=n;i++){if(v[i])continue;flag=0;dfs(i);cnt+=flag;}if(cnt>1)return puts("-1")&0;memset(v,0,sizeof(v));for(int i=1;i<=n;i++){if(!w[i])continue;solve(i);int l=q.size();if(w[i])l--;printf("%d\n",l);while(l){printf("%d ",q.front());l--;q.pop();}return 0;}printf("0\n");return 0;
}

CF453C-Little Pony and Summer Sun Celebration【构造】相关推荐

  1. codeforces 453C Little Pony and Summer Sun Celebration

    codeforces 453C Little Pony and Summer Sun Celebration 这道题很有意思,虽然网上题解很多了,但是我还是想存档一下我的理解. 题意可以这样转换:初始 ...

  2. CF453C:Little Pony and Summer Sun Celebration(dfs、构造)

    解析 比较巧妙的一道题 首先做一棵dfs生成树出来 尝试把它的欧拉序列作为答案 但是这样可能会有的地方不符合条件 如果x点的奇偶性不符合,就在序列中加入一个(x,fa) 同时改变x和fa的奇偶性 显然 ...

  3. Codeforces Round #706 (Div. 2) E. Garden of the Sun 思维构造

    传送门 题意: 给你一个n×mn×mn×m的矩阵,其中包含字符′.′'.'′.′和′X′'X'′X′,你可以将任何′.′'.'′.′改成′X′'X'′X′,现在问你能否通过修改一些′.′'.'′.′来 ...

  4. 信仰之题——Codeforces Round 259(附题面完整翻译)

    终于下定决心要把整套题做完了. 最早认识这套题不是因为什么板刷,也不是因为什么模拟赛,而是这套题目标题里清一色的"pony",我想这也是为什么我会管这套题叫信仰之题吧(笑). 不过 ...

  5. Frida模板Hook

    JAVA层HOOK: # -*- coding: utf-8 -*- """ Spyder EditorThis is a temporary script file.J ...

  6. 【C++】动态内存管理/move/以及移动构造与移动赋值运算符

    文章目录 1 .对象移动与右值引用 实际应用过程中遇到的问题及其解决方案 c++中临时变量不能作为非const的引用参数 2. 动态内存管理类 3. 对象移动与右值引用 4. 移动构造与移动复制运算符 ...

  7. SprintBoot中如何构造Bean原理分析

    2019独角兽企业重金招聘Python工程师标准>>> MySpringBoot打算构造加入Bean的功能,代码完成,下面解释操作&原理. ----------------- ...

  8. 派生类的拷贝构造【C++继承】

    语法 拷贝构造顺序 图示 说明 拷贝构造顺序 拷贝构造实例 语法 派生类::派生类(const 派生类& another):基类(another),派生类新成员(another.新成员) {/ ...

  9. 派生类的构造【C++继承】

    构造规则 语法格式 构造顺序 图示 说明 构造顺序 子类构造器实战 层次设计感悟 构造规则 派生类中,由基类继承而来的成员的初始化工作,由基类的构造函数完成. 派生类中新增的成员在派生类的构造函数中初 ...

最新文章

  1. 关于CSDN不给任何通知强制关闭我的6年博客,我深表痛心
  2. LDNFSGB: prediction of long non-coding rna and disease association using network feature similarity
  3. 获得html元素自身的宽度
  4. mmap和shm共享内存的区别和联系
  5. Swoole实现私聊群聊
  6. 利用“多说”制作留言板、评论系统
  7. RestFull架构
  8. MTK(android init.rc) 写一个开机启动的服务
  9. 心语收集12:我以为要是唱的用心良苦,你就会对我多点在乎
  10. git merge和git merge --no-ff有什么区别?
  11. 手机游戏中的社交互动与任务剧情
  12. wp login.php 打不开,解决wordpress后台无法登录或显示空白的问题
  13. 【HDU 5033】【经典单调栈问题】Building
  14. 层次分析法软件操作步骤(yaahp)
  15. 数据库SQL语句总结大全
  16. python自动化怎么发微信_在python中使用itchat发送微信消息
  17. Java使用DES加密解密
  18. 「游戏」c++贪吃蛇1.1
  19. 在centOS系统上python导入baidu-aip
  20. 2022(一等奖)B360基于Arcpy与SVM的滑坡易发性评价

热门文章

  1. opencv计算两数组的乘积_#剑指Offer#12. 构建乘积数组
  2. linux改环境语言,linux下改变语言环境
  3. matlab画孔斯曲面,CAD CAM技术基础:第五讲 孔斯曲面
  4. php 面向对象 教程,PHP学习笔记之面向对象设计_PHP教程
  5. 后端返回number类型数据_Javascript基础教程之数据类型 (数值 Number)
  6. 量子计算机与新型传感器,新型量子传感器为超导量子计算机发展开辟了新路径...
  7. c语言歌手预测成绩,5个裁判可以对10个歌手进行打分,计算各个歌手的最终得分排列...
  8. python数据导入hive_Python操作HIve,将数据插入到Mysql
  9. 7-8 数字三角形 (31 分)(思路+详解+动态规划)Come Baby!!!!!!!!!!!
  10. 一般动态规划问题合集(Leetcode题解-Python语言)