CF453C Little Pony and Summer Sun Celebration
如果一个点需要经过奇数次我们就称其为奇点,偶数次称其为偶点。
考虑不合法的情况,有任意两个奇点不连通(自己想想为什么)。
那么需要处理的部分就是包含奇点的唯一一个连通块。先随意撸出一棵生成树,然后正常地 dfs 下去。显然,叶子结点会成为奇点,非叶子结点会成为偶点。
当然这会存在不合法的情况,即我们需要改变一些结点的奇偶性。发现 dfs 到 \(u\) 结点的过程中我们可以进行这样一种操作,\(u\to v\to u(fa_v=u)\),它同时改变了 \(u\) 和 \(v\) 的奇偶性。所以我们在处理完以 \(v\) 为根的子树后(即子树除了 \(v\) 都合法),如果 \(v\) 还不合法,我们就对 \(v\) 和 \(v\) 的父亲 \(u\) 进行这个操作,使得 \(v\) 合法。
最后只剩下根结点,如果根结点不合法就去掉最后一步(不回到根结点)。
每个非根结点至多做一次操作,每次操作花费 \(2\),再加上 dfs 的 \(2n\),所以序列长度至多是 \(4n-1\),可以放心通过。
时间复杂度 \(O(n+m)\)~
code:
#include<bits/stdc++.h>
using namespace std;
#define N 100005
#define For(i,x,y)for(i=x;i<=(y);i++)
struct node
{
bool used;
int next,to;
}e[200005];
bool vis[N],rem[N];
int opt[400005],head[N],g,cnt;
int read()
{
int A;
bool K;
char C;
C=A=K=0;
while(C<'0'||C>'9')K|=C=='-',C=getchar();
while(C>'/'&&C<':')A=(A<<3)+(A<<1)+(C^48),C=getchar();
return(K?-A:A);
}
inline void add(int u,int v)
{
e[++g].to=v;
e[g].next=head[u];
head[u]=g;
}
void dfs(int u)
{
int i,v;
vis[u]=1;
for(i=head[u];i;i=e[i].next)
{
v=e[i].to;
if(!vis[v])dfs(v),e[i].used=1;
}
}
bool work(int u,int fa)
{
int i,v;
bool bo=1,tmp;
opt[++cnt]=u;
for(i=head[u];i;i=e[i].next)
if(e[i].used)
{
v=e[i].to;
if(v==fa)continue;
tmp=work(v,u);
opt[++cnt]=u;
bo^=1;
if(!tmp)
{
opt[++cnt]=v;
opt[++cnt]=u;
bo^=1;
}
}
return bo==rem[u];
}
void write(int X)
{
if(X<0)putchar('-'),X=-X;
if(X>9)write(X/10);
putchar(X%10|48);
}
int main()
{
int n,m,i,u,v;
n=read(),m=read();
For(i,1,m)
{
u=read(),v=read();
add(u,v),add(v,u);
}
For(i,1,n)rem[i]=read();
For(u,1,n)
if(rem[u]&1)break;
dfs(u);
For(i,1,n)
if(!vis[i]&&rem[i]&1)puts("-1"),exit(0);
if(!work(u,0))cnt--;
write(cnt);
putchar('\n');
For(i,1,cnt)write(opt[i]),putchar(' ');
return 0;
}
CF453C Little Pony and Summer Sun Celebration的更多相关文章
- CF453C Little Pony and Summer Sun Celebration(构造、贪心(?))
CF453C Little Pony and Summer Sun Celebration 题解 这道题要求输出任意解,并且路径长度不超过4n就行,所以给了我们乱搞构造的机会. 我这里给出一种构造思路 ...
- CF453C Little Pony and Summer Sun Celebration (DFS)
http://codeforces.com/contest/456 CF454E Codeforces Round #259 (Div. 1) C Codeforces Round #259 (Di ...
- codeforces 453C Little Pony and Summer Sun Celebration
codeforces 453C Little Pony and Summer Sun Celebration 这道题很有意思,虽然网上题解很多了,但是我还是想存档一下我的理解. 题意可以这样转换:初始 ...
- [CF453C] Little Poney and Summer Sun Celebration (思维)
[CF453C] Little Poney and Summer Sun Celebration (思维) 题面 给出一张N个点M条边的无向图,有些点要求经过奇数次,有些点要求经过偶数次,要求寻找一条 ...
- CF 453C. Little Pony and Summer Sun Celebration
CF 453C. Little Pony and Summer Sun Celebration 构造题. 题目大意,给定一个无向图,每个点必须被指定的奇数或者偶数次,求一条满足条件的路径(长度不超\( ...
- CF453C-Little Pony and Summer Sun Celebration【构造】
正题 题目链接:https://www.luogu.com.cn/problem/CF453C 题目大意 \(n\)个点\(m\)条边的一张无向图,每个节点有一个\(w_i\)表示该点需要经过奇数/偶 ...
- codeforces 454 E. Little Pony and Summer Sun Celebration(构造+思维)
题目链接:http://codeforces.com/contest/454/problem/E 题意:给出n个点和m条边,要求每一个点要走指定的奇数次或者是偶数次. 构造出一种走法. 题解:可能一开 ...
- Codeforces 454E. Little Pony and Summer Sun Celebration
题意:给n个点m条边的无向图,并给出每个点的访问次数奇偶,求构造一条满足条件的路径(点和边都可以走). 解法:这道题还蛮有意思的.首先我们可以发现在一棵树上每个儿子的访问次数的奇偶是可以被它的父亲控制 ...
- codeforces Round #259(div2) E解决报告
E. Little Pony and Summer Sun Celebration time limit per test 1 second memory limit per test 256 meg ...
随机推荐
- Redis学习笔记(四)——数据结构之List
一.介绍 Redis列表(List)是简单的字符串列表,按照插入顺序排序.你可以添加一个元素到列表的头部(left)或者尾部(right),一个列表最多可以包含232-1个元素(4294967295, ...
- MongoDB复制 --- MongoDB基础用法(五)
复制 MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您从硬件故障和服务中断中恢复 ...
- C语言积累一点点
778. 水位上升的泳池中游泳https://leetcode-cn.com/problems/swim-in-rising-water/ 839. 相似字符串组 https://leetco ...
- go-zero 是如何追踪你的请求链路的
go-zero 是如何追踪你的请求链路 微服务架构中,调用链可能很漫长,从 http 到 rpc ,又从 rpc 到 http .而开发者想了解每个环节的调用情况及性能,最佳方案就是 全链路跟踪. 追 ...
- 被巴菲特看中的Snowflake,是怎样深刻改变云计算产业的?
众所周知,在很长一段时间里,巴菲特都从来不碰科技股.但人总是会变的,他在2016年开始首次持仓苹果,并在此后一再增持,目前苹果为伯克希尔第一大重仓股. 前不久,巴菲特持股了人生中的又一家科技公司--S ...
- CSS换行和省略号
换行 原地址:https://www.cnblogs.com/meowcool/p/10130103.html //强制不换行 div{ white-space:nowrap; } //自动换行 di ...
- .netcore使用autofac
.netcore3.1使用autofac (.netcore中本身已经实现了IOC容器,其实没有必要替换成autofac.如果非常习惯autofac,替换也是无可厚非的.) 第一步.在项目中引入Aut ...
- leetcode24:word-ladder-ii
题目描述 给定两个单词(初始单词和目标单词)和一个单词字典,请找出所有的从初始单词到目标单词的最短转换序列: 每一次转换只能改变一个单词 每一个中间词都必须存在单词字典当中 例如: 给定的初始单词st ...
- Java多线程技术:实现多用户服务端Socket通信
目录 前言回顾 一.多用户服务器 二.使用线程池实现服务端多线程 1.单线程版本 2.多线程版本 三.多用户与服务端通信演示 四.多用户服务器完整代码 最后 前言回顾 在上一篇<Java多线程实 ...
- nginx安装 linux
1.安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2.创建一个文件夹 cd /usr/local m ...