正题

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


题目大意

\(n\)个点\(m\)条边的一张无向图,每个节点有一个\(w_i\)表示该点需要经过奇数/偶数次。

求一条满足条件的长度不超过\(4n\)的路径

\(1\leq n,m\leq 10^5\)


解题思路

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

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

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

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

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

时间复杂度\(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. 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. CF453C Little Pony and Summer Sun Celebration

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

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

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

  5. codeforces 453C Little Pony and Summer Sun Celebration

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

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

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

  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. CF453(Div1 简单题解)

    A .Little Pony and Expected Maximum pro:给定M,N,表示一个M面的骰子,甩N次,问出现的最大的数的期望. sol:容斥,f(i)表示最大数<=i的期望,那 ...

随机推荐

  1. React性能优化总结

    本文主要对在React应用中可以采用的一些性能优化方式做一下总结整理 前言 目的 目前在工作中,大量的项目都是使用react来进行开展的,了解掌握下react的性能优化对项目的体验和可维护性都有很大的 ...

  2. itoa函数递归实现

    库函数中有atoi函数,用意是将字符形式输入的数据转换成数字,而库函数有没有提供一个将数字转换成字符的函数呢?答案是有的,而且功能很是强大,那就是sprintf().snprintf()格式化转换函数 ...

  3. Jmeter的默认字体和窗口的设置方法(一次改动,永久生效!!!)

    因为每次打开jmeter看到的界面不如意,而且会影响工作发挥和效率,为了给大家带来良好的工作体验,为此给出最完美的设置方法,如下: 第一步: 找到jmeter所在目录--->bin---> ...

  4. ES6 class——音乐播放器实例

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. Ubuntu 16.04 Install NVidia Driver (download from nvidia official site)

    sudo apt-get update sudo apt-mark hold libreoffice sudo apt-get update && sudo apt-get upgra ...

  6. linux shell 删除满足正则表达式的文件

    用find配合xargs rm find . -type f -name "to_delete_file_[a-z]_*_[0-9].jpg" | xargs rm

  7. Mac 安装 Android commandlinetools 各种报错的问题

    https://developer.android.com/studio/releases/platform-tools commandlinetools-mac 下载地址 解压后直接运行 sdkma ...

  8. Redis的安装、基本使用以及与SpringBoot的整合

    1.概述 Redis 是现在很流行的一个 NoSql 数据库,每秒读取可以达到10万次,能够将数据持久化,支持多种数据结构,容灾性强,易扩展,常用于项目的缓存中间件. 今天我们就来聊聊关于Redis的 ...

  9. C#新版本风格(NetCore)项目文件

    在VisualStudio中创建NetCore以上版本的项目,使用的都是新版本风格的项目文件. 和旧版本.NetFramework版本的项目文件区别: 双击项目可直接打开csproj文件进行编辑配置 ...

  10. Mysql常用sql语句(6)- limit 限制查询结果的条数

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 实际工作中,我们的数据表数据肯定都是万级别的,如 ...