如果一个点需要经过奇数次我们就称其为奇点,偶数次称其为偶点。

考虑不合法的情况,有任意两个奇点不连通(自己想想为什么)。

那么需要处理的部分就是包含奇点的唯一一个连通块。先随意撸出一棵生成树,然后正常地 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的更多相关文章

  1. CF453C Little Pony and Summer Sun Celebration(构造、贪心(?))

    CF453C Little Pony and Summer Sun Celebration 题解 这道题要求输出任意解,并且路径长度不超过4n就行,所以给了我们乱搞构造的机会. 我这里给出一种构造思路 ...

  2. CF453C Little Pony and Summer Sun Celebration (DFS)

    http://codeforces.com/contest/456  CF454E Codeforces Round #259 (Div. 1) C Codeforces Round #259 (Di ...

  3. codeforces 453C Little Pony and Summer Sun Celebration

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

  4. [CF453C] Little Poney and Summer Sun Celebration (思维)

    [CF453C] Little Poney and Summer Sun Celebration (思维) 题面 给出一张N个点M条边的无向图,有些点要求经过奇数次,有些点要求经过偶数次,要求寻找一条 ...

  5. CF 453C. Little Pony and Summer Sun Celebration

    CF 453C. Little Pony and Summer Sun Celebration 构造题. 题目大意,给定一个无向图,每个点必须被指定的奇数或者偶数次,求一条满足条件的路径(长度不超\( ...

  6. CF453C-Little Pony and Summer Sun Celebration【构造】

    正题 题目链接:https://www.luogu.com.cn/problem/CF453C 题目大意 \(n\)个点\(m\)条边的一张无向图,每个节点有一个\(w_i\)表示该点需要经过奇数/偶 ...

  7. codeforces 454 E. Little Pony and Summer Sun Celebration(构造+思维)

    题目链接:http://codeforces.com/contest/454/problem/E 题意:给出n个点和m条边,要求每一个点要走指定的奇数次或者是偶数次. 构造出一种走法. 题解:可能一开 ...

  8. Codeforces 454E. Little Pony and Summer Sun Celebration

    题意:给n个点m条边的无向图,并给出每个点的访问次数奇偶,求构造一条满足条件的路径(点和边都可以走). 解法:这道题还蛮有意思的.首先我们可以发现在一棵树上每个儿子的访问次数的奇偶是可以被它的父亲控制 ...

  9. codeforces Round #259(div2) E解决报告

    E. Little Pony and Summer Sun Celebration time limit per test 1 second memory limit per test 256 meg ...

随机推荐

  1. 双非本科拿到阿里腾讯字节,分享Java后端路线

    前言 最近有很多小师妹来问我. 师妹:师兄~看了你之前的从腾讯到阿里,最后选择字节,觉得你特别厉害,请问你是怎么进BAT的呀,能不能告诉我你的学习路线呀~ 既然小师妹都这么问了,那我在这篇就如实回答她 ...

  2. 【1】TensorFlow光速入门-tensorflow开发基本流程

    本文地址:https://www.cnblogs.com/tujia/p/13862339.html 系列文章: [0]TensorFlow光速入门-序 [1]TensorFlow光速入门-tenso ...

  3. 【转】Setting up SDL Extension Libraries on Windows

    FROM: http://lazyfoo.net/tutorials/SDL/06_extension_libraries_and_loading_other_image_formats/window ...

  4. JAVA学习第一阶段(1)

    java入门第一阶段 1.在java中接受并保存用户输入的值: (1)import java.util.Scanner//引入包 (2)Scanner input=new Scanner (Syste ...

  5. Java学习的第五十三天

    1.例9.5引用静态数据成员 public class Cjava { public static void main(String[]args) { Box b[] = {new Box(12,15 ...

  6. go-zero 是如何追踪你的请求链路的

    go-zero 是如何追踪你的请求链路 微服务架构中,调用链可能很漫长,从 http 到 rpc ,又从 rpc 到 http .而开发者想了解每个环节的调用情况及性能,最佳方案就是 全链路跟踪. 追 ...

  7. python实现非常有趣的数学问题

    1.无重复数字的三位数 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? import itertools ret = [] for i in range(1, 5) ...

  8. iOS 导航栏 工具条

    导航栏最常见的例子就是返回按钮的所在 在AppDelegate.m中,代码布局最开始定义窗口的时候, _window.rootViewController就应该为一个UINavigationContr ...

  9. 获取url后面的参数

    function getQueryVariable(variable) { var query = window.location.search.substring(1); var vars = qu ...

  10. Pytest系列(八) - 自定义标记mark的使用

    一.前言: pytest 支持自定义标记,自定义标记方便用例模块划分,也可以理解方便管理,配合标记参数 -m使用 二.示例代码 # -*- coding: utf-8 -*- # @Time : 20 ...