正题

题目链接: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. flutter查看安全码SHA1

    最近flutter技术调研高德地图插件时,要用到安全码,可以打开cmd,键入一下命令查看.(注意路径用户名yourusernamehere改为自己的) keytool -list -v -keysto ...

  2. 数据结构--Dijkstra算法最清楚的讲解

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止 ###基本思想 通过Dij ...

  3. prism 的学习网站

    C#的学习网址: https://www.cnblogs.com/zh7791

  4. servlet初识servletConfig

    package day09; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; ...

  5. jQuery中的层级选择器(四、二):后代元素、子元素、相邻元素、兄弟元素

    <!DOCTYPE html> <html> <head> <title>层次选择器</title> <meta http-equiv ...

  6. 【MATLAB】常用命令快速入门,国赛加油

    矩阵运算 矩阵的基本生成 m1 = 1:5 % 生成行矩阵[1,2,3,4,5] m2 = 1:2:10 % 起点:步长:终点 [1,3,5,7,9] linspace(x1,x2,n) % 生成 n ...

  7. eslint and stylelint config

    eslint: module.exports = {   root: true,   env: {     browser: true,     es6: true,     node: true   ...

  8. golang channel原理

    channel介绍 channel一个类型管道,通过它可以在goroutine之间发送和接收消息.它是Golang在语言层面提供的goroutine间的通信方式. 众所周知,Go依赖于称为CSP(Co ...

  9. GIMP 一键均匀添加多条参考线 一键均匀切分图片

    添加参考线 #!/usr/bin/env python2 # -*- coding: utf-8 -*- from gimpfu import * # orientation: ORIENTATION ...

  10. Abp VNext权限定义

    在Shop.Application.Contracts项目中Permissions目录下ShopPermissions定义权限名 namespace Shop.Permissions { public ...