思路来自这里,重点大概是想到建树和无解情况,然后就变成树形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. mosquitto安装遇到问题和解决办法

    问题1 make编译报错,提示xsltproc命令未找到 解决办法: yum  install libxslt 问题2 make编译报错,提示: failed to load external ent ...

  2. 在VMware Workstation10下CentOS7虚拟机中创建与主机共享文件夹的详细步骤

    一.前言 在使用虚拟机时,常常需要与宿主计算机(以下简称为主机)操作系统交换文件,为此需要在虚拟机与主机之间建立共享文件夹. 二. 安装VMTools 要使用共享文件机制,必须首先安装VMTools. ...

  3. 【计算几何】The Queen’s Super-circular Patio

    The Queen’s Super-circular Patio 题目描述 The queen wishes to build a patio paved with of a circular cen ...

  4. 使用UTF8字符集存储中文生僻字

    使用UTF8字符集存储中文生僻字 一.相关学习BLOG https://www.cnblogs.com/jyzhao/p/8654412.html http://blog.itpub.net/7818 ...

  5. python03-break、continue、for循环、数据bytes类型、字符串与字节的关系、变量指向与深浅拷贝、set集合、文件操作

    目录: 1.break.continue 2.for循环 3.数据bytes类型 4.字符串与字节的关系 5.变量指向与深浅拷贝 6.set集合 7.文件操作 一.break.continue bre ...

  6. (七)Redis之Keys的通用操作

    package myRedis01; import java.util.HashMap; import java.util.List; import java.util.Map; import jav ...

  7. NHiberante从.net framework转移到.net standard(.net core 2.2)时遇到的坑及填坑

    在.net framework中的创建session代码先贴一个 public class SessionBuilder { private static ISessionFactory _sessi ...

  8. Dapper 入门

    中文文档连接:https://www.w3cschool.cn/dapperorm/dapperorm-toj931f2.html 官网文档连接:https://dapper-tutorial.net ...

  9. VisualSVN 关于权限(第2篇)

    最终的答案: 仓库本身不能给他增加访问权限,必须增加否则连不上,不增加的时候 他默认就是No Access: 仓库本身可以理解为:祖宗,他是访问权限的根基.子目录会继承他的权限. 那么既然必须给他增加 ...

  10. ADF一个EO的事物提交周期

    客户端通过传递键对象调用实体定义的findByPrimaryKey(),获得EO.ADF框架首先检查实体缓存, 如果在实体缓存中没有找到实体,就执行SQL SELECT查询,从数据库读取行.示例如下: ...