CF453C Little Pony and Summer Sun Celebration

题解

这道题要求输出任意解,并且路径长度不超过4n就行,所以给了我们乱搞构造的机会。

我这里给出一种构造思路:

首先一个连通块如果没有要求奇数次的点,那么就可以不管他,如果超过一个连通块内有要求奇数次的点,那么无解。

然后在那个唯一需要走的连通块里,我们随便抠一个生成树出来,从根遍历


首先把每次向下走以及回溯的路径记录到序列的新一位(并不需要一开始就把根节点加入,反正最后会回溯到根,于是最后一个元素添加为根),顺便记录奇偶性的变化,

这个过程增加的序列长度 <= 2n

然后在①的过程中,对于任意非根的点 i,当他要回溯到 fa[i] 时,如果他的次数奇偶性与我们想要的不同,那么在序列中加入一段“fa[i],i”,这样就把 i 和 i 的子树都能调对,回溯后再考虑fa[i],

这个过程增加的序列长度 <= 2n

在②的最后,回溯到根时,如果他的次数奇偶性不正确,就把序列最后一个元素(恰好就为根了吧)删掉,如果对于只有一个节点的情况,就在序列头加一个。

设个过程增加的序列长度在 -1 到 1 之间


可以证明,最终的序列长度不会超过4n。

C O D E

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<algorithm>
#define MAXN 100005
#define ENDL putchar('\n')
#define LL long long
#define lowbit(x) ((-x)&(x))
using namespace std;
inline LL read() {
LL f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s == '-')f = -1;s = getchar();}
while(s >= '0' && s <= '9') {x = x * 10 + (s - '0');s = getchar();}
return x * f;
}
int n,m,i,j,s,o,k,root;
vector<int> g[MAXN];
int fa[MAXN];
int findf(int x) {return fa[x] == x ? x:(fa[x] = findf(fa[x]));}
void unionSet(int x,int y) {fa[findf(x)] = findf(y);}
int c[MAXN],cnt;
bool f[MAXN];
int pr[MAXN*4],cnp;
int dfs(int x,int fa) {
int res = c[x];
f[x] = 1;
for(int i = 0; i < g[x].size();i ++) {
if(g[x][i] != fa) {
res = max(res,dfs(g[x][i],x));
}
}
return res;
}
void dfs2(int x,int fa) {
for(int i = 0; i < g[x].size();i ++) {
if(g[x][i] != fa) {
pr[++ cnp] = g[x][i];
c[g[x][i]] ^= 1;
dfs2(g[x][i],x);
pr[++ cnp] = x;
c[x] ^= 1;
}
}
if(fa) {
if(c[x]) {
pr[++ cnp] = fa;
pr[++ cnp] = x;
c[fa] ^= 1;
c[x] ^= 1;
}
}
else if(c[x]) {
if(cnp > 0) cnp --;
else pr[++ cnp] = x,c[x] ^= 1;
}
return ;
}
int main() {
n = read();m = read();
for(int i = 1;i <= n;i ++) fa[i] = i;
for(int i = 1;i <= m;i ++) {
s = read();o = read();
if(findf(s) ^ findf(o))
g[s].push_back(o),g[o].push_back(s),unionSet(s,o);
}
for(int i = 1;i <= n;i ++) c[i] = read();
for(int i = 1;i <= n;i ++) {
if(!f[i]) {
int dt;
cnt += (dt = dfs(i,0));
if(dt) root = i;
}
}
if(cnt > 1) {
printf("-1\n");
return 0;
}
// printf("cnt & root:%d %d\n",cnt,root);
if(root) dfs2(root,0);
printf("%d\n",cnp);
for(int i = 1;i <= cnp;i ++) {
printf("%d ",pr[i]);
}ENDL;
return 0;
}

CF453C Little Pony and Summer Sun Celebration(构造、贪心(?))的更多相关文章

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

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

  2. CF453C Little Pony and Summer Sun Celebration

    如果一个点需要经过奇数次我们就称其为奇点,偶数次称其为偶点. 考虑不合法的情况,有任意两个奇点不连通(自己想想为什么). 那么需要处理的部分就是包含奇点的唯一一个连通块.先随意撸出一棵生成树,然后正常 ...

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

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

  4. codeforces 453C Little Pony and Summer Sun Celebration

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

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

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

  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. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

随机推荐

  1. 一文带你了解J.U.C的FutureTask、Fork/Join框架和BlockingQueue

    摘要: J.U.C是Java并发编程中非常重要的工具包,今天,我们就来着重讲讲J.U.C里面的FutureTask.Fork/Join框架和BlockingQueue. 本文分享自华为云社区<[ ...

  2. SAP Easy tree

    *&---------------------------------------------------------------------* *& Include SIMPLE_T ...

  3. Docker安装Portainer管理工具

    1.下载镜像 docker pull portainer/portainer 2.启动 docker run -d -p 9000:9000 --restart=always -v /var/run/ ...

  4. Wabacus框架中inputbox和datepicker实现时间日历

    前提是要引入WdatePicker.js. 一.年月日时分秒(中文) <inputbox type="datepicker" inputboxparams="dat ...

  5. go语言学习笔记-初识Go语言

    Go语言是怎样诞生的? Go语言的创始人有三位,分别是图灵奖获得者.C语法联合发明人.Unix之父肯·汤普森(Ken Thompson).Plan 9操作系统领导者.UTF-8编码的最初设计者罗伯·派 ...

  6. Transferable Joint Attribute-Identity Deep Learning for Unsupervised Person Re-Identification理解

    简介:这篇文章属于跨域无监督行人再识别,不同于大部分文章它使用了属性标注.旨在于能够学习到有属性语义与有区分力的身份特征的表达空间(TJ-AIDL),并能够转移到一个没有看到过的域. 贡献: 提出了一 ...

  7. IDEA的概述和IDEA的安装

    开发工具概述 IDEA是一个专门针对Java的集成开发工具(IDE),由Java语言编写.所以,需要有JRE运行环境并配置好环境变量. 它可以极大地提升我们的开发效率.可以自动编译,检查错误.在公司中 ...

  8. Map接口总结(如何使用默认方法)

    Map接口总结(如何使用默认方法) Map的基本使用 默认方法的问题,有什么坑 常用的默认方法应用场景 基本操作 get put(区别:Collection接口中添加为set) putAll remo ...

  9. Proxmox6.2简单配置

    刻录: 使用rufus+GPT+DD方式写入U盘 一.更换国内源: 1)删除企业源 mv /etc/apt/sources.list.d/pve-enterprise.list /etc/apt/so ...

  10. war包解压与压缩

    解压:jar -xvf ROOT.war 压缩:jar -cvfM0 ROOT.war ./