思路来自这里,重点大概是想到建树和无解情况,然后就变成树形DP了- -

/*
CodeForces 840B - Leha and another game about graph [ 增量构造,树上差分 ] | Codeforces Round #429(Div 1)
题意:
选择一个边集合,满足某些点度数的奇偶性
分析:
将d = 1的点连成一颗树,不在树上的点都不连边。
可以发现,当某个节点u的所有子节点si均可操控 (u, si) 来满足自身要求
即整棵树上至多只有1个点不满足自身要求,就是根节点,此时需要在树中任意位置接入 d=-1 的一个节点 然后研究如何在这棵树上选边,考虑增量法
每次选择两个d=1的点加入树中,并将这棵树上两点间路径上所有的边选择状态反转
易证对于新加入的节点满足要求,而路径上原有节点仍满足要求
最后若只剩一个d=1的节点,则和一个d=-1的节点组成一对
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 3e5+5;
struct Edge {
int v, i;
};
vector<Edge> edge[N];
vector<int> c1, c2;
int n, m;
int d[N];
bool vis[N], flag[N];
vector<int> ans;
void dfs(int u)
{
vis[u] = 1;
for (auto& e : edge[u])
{
if (vis[e.v]) continue;
dfs(e.v);
if (flag[e.v]) ans.push_back(e.i);
flag[u] ^= flag[e.v];
}
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
{
scanf("%d", &d[i]);
if (d[i] == 1) c1.push_back(i);
else if (d[i] == -1) c2.push_back(i);
}
for (int i = 1; i <= m; i++)
{
int u, v; scanf("%d%d", &u, &v);
edge[u].push_back(Edge{v, i});
edge[v].push_back(Edge{u, i});
}
if (c1.size()%2 && c2.empty())
{
puts("-1"); return 0;
}
int k = c1.size()/2;
for (int i = 0; i < k; i++)
{
flag[c1[i]] = flag[c1[k+i]] = 1;
}
if (c1.size() % 2)
{
flag[c1[c1.size()-1]] = flag[c2[0]] = 1;
}
dfs(1);
printf("%d\n", ans.size());
for (auto& x : ans) printf("%d ", x);
puts("");
}

  

CodeForces 840B - Leha and another game about graph | Codeforces Round #429(Div 1)的更多相关文章

  1. CodeForces 840A - Leha and Function | Codeforces Round #429 (Div. 1)

    /* CodeForces 840A - Leha and Function [ 贪心 ] | Codeforces Round #429 (Div. 1) A越大,B越小,越好 */ #includ ...

  2. CodeForces 840C - On the Bench | Codeforces Round #429 (Div. 1)

    思路来自FXXL中的某个链接 /* CodeForces 840C - On the Bench [ DP ] | Codeforces Round #429 (Div. 1) 题意: 给出一个数组, ...

  3. Codeforces Round #429 (Div. 2/Div. 1) [ A/_. Generous Kefa ] [ B/_. Godsend ] [ C/A. Leha and Function ] [ D/B. Leha and another game about graph ] [ E/C. On the Bench ] [ _/D. Destiny ]

    PROBLEM A/_ - Generous Kefa 题 OvO http://codeforces.com/contest/841/problem/A cf 841a 解 只要不存在某个字母,它的 ...

  4. Codeforces Round #429 (Div. 2) - D Leha and another game about graph

    Leha and another game about graph 题目大意:给你一个图,每个节点都有一个v( -1 , 0 ,1)值,要求你选一些边,使v值为1 的点度数为奇数,v值为0的度数为偶数 ...

  5. Codeforces Round #429 (Div. 2) 补题

    A. Generous Kefa 题意:n个气球分给k个人,问每个人能否拿到的气球都不一样 解法:显然当某种气球的个数大于K的话,就GG了. #include <bits/stdc++.h> ...

  6. Leha and another game about graph CodeForces - 840B (dfs)

    链接 大意: 给定无向连通图, 每个点有权值$d_i$($-1\leq d_i \leq 1$), 求选择一个边的集合, 使得删除边集外的所有边后, $d_i$不为-1的点的度数模2等于权值 首先要注 ...

  7. Codeforces 841D Leha and another game about graph - 差分

    Leha plays a computer game, where is on each level is given a connected graph with n vertices and m  ...

  8. 【推导】【DFS】Codeforces Round #429 (Div. 1) B. Leha and another game about graph

    题意:给你一张图,给你每个点的权值,要么是-1,要么是1,要么是0.如果是-1就不用管,否则就要删除图中的某些边,使得该点的度数 mod 2等于该点的权值.让你输出一个留边的方案. 首先如果图内有-1 ...

  9. 【CodeForces】841D. Leha and another game about graph(Codeforces Round #429 (Div. 2))

    [题意]给定n个点和m条无向边(有重边无自环),每个点有权值di=-1,0,1,要求仅保留一些边使得所有点i满足:di=-1或degree%2=di,输出任意方案. [算法]数学+搜索 [题解] 最关 ...

随机推荐

  1. JDBC 注册驱动,获取连接

    jdbc 动力节点视频教程 JDBC编程六步 1.注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库) 2.获取连接 (表示JVM进程和数据库进程之间的通道打开了,属于进程间的通信,重量 ...

  2. PHP之即点即改

    html: <td data-hide="1200" class="px12" id ="<?php echo $v['g_id'];?& ...

  3. Linux (x86) Exploit 开发系列教程之七 绕过 ASLR -- 第二部分

    (1)原理: 使用爆破技巧,来绕过共享库地址随机化.爆破:攻击者选择特定的 Libc 基址,并持续攻击程序直到成功.这个技巧是用于绕过 ASLR 的最简单的技巧. (2)漏洞代码 //vuln.c # ...

  4. python学习——while True的用法

    在学习过程中,经常能遇到采用while True的用法.下面以一个例子进行说明: 建立一个用户登录系统,用户输入用户名和密码,如果正确就可以进入系统. 1.我自己最开始的写法: d = {} #数据库 ...

  5. powerdesign中逆向工程后name和comment的互换

    powerdesign 中,将数据库中可以逆向生成pdm的结构图,比较清晰看到系统的结构, 但假如是db先行的话,一般是db中的每个列中用comment中文注释说明这列是 干什么的,但逆向工程后,会发 ...

  6. java封装数据类型——Integer 缓存策略验证

    上一篇学习 Integer 类型源码,知道了它使用缓存策略,默认对 [-128, 127] 范围的对象进行类加载时自动创建缓存. Integer 源码学习:https://www.cnblogs.co ...

  7. Docker启动Elasticsearch报错java.nio.file.AccessDeniedException

    报错信息 Caused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes 问题分析 表面上是说容 ...

  8. puml 用于代码注释

    notebook 笔记本 @startuml rectangle sql_decode.py{ object SQLDataset object Name SQLDataset : meta = &q ...

  9. CSS伸缩布局

    1. 伸缩布局应用: 伸缩布局应用 主轴: Flex容器的主轴用来配置Flex项目,默认是水平方向 侧轴: 与主轴垂直的轴称为侧轴,默认还是垂直方向 方向: 默认是主轴从左向右, 侧轴默认是从上到下 ...

  10. RabbitMQ的基本概念

    1:基本概念 ConnectionFactory(连接工厂): 生产Connection的的工厂 Connection(连接):是RabbitMQ的socket的长链接,它封装了socket协议相关部 ...