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的度数为偶数,v值为-1的节点没有限制。让你输出边的集合,
如果不存在这样的边集,输出-1。
写的时候没啥思路,dfs瞎搞了一下过不了。
思路:我们先考虑没有解的情况,如果v值为1的点为奇数个,且没有v为-1的点,则不存在
解,因为你添加一条边改变了两个v值非-1点的奇偶性,又有奇数个v值为1的点,不可能满足
全部点,所以不存在解。然后我们把当前节点只和它的父节点联系在一起,如果当前节点
不满足条件,就加上它和它父节点之间的那条边,这里如果有v位-1的点,我们优先用它作为
根节点,因为子节点必定满足了条件,只要看根节点就行了。
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int>
#define pb push_back
using namespace std;
const int N=*1e5+;
int v[N],n,m;
vector<pii> e[N];
vector<int> ans;
bool vis[N],e_vis[N];
void dfs(int u,int e_id)
{
vis[u]=true;
bool flag=false;
int len=e[u].size();
for(int i=;i<e[u].size();i++)
{
pii p=e[u][i];
if(vis[p.fi]) continue;
dfs(p.fi,p.se);
if(e_vis[p.se]) flag=!flag;
}
if(v[u]==- || flag==v[u]) return;
if(e_id!=-)
{
e_vis[e_id]=true;
ans.pb(e_id);
}
}
int main()
{
cin>>n>>m;
int st=-,sum=;
for(int i=;i<=n;i++)
{
scanf("%d",&v[i]);
if(st==- && v[i]==-) st=i;
if(v[i]!=-) sum+=v[i];
}
for(int i=;i<=m;i++)
{
int f,t; scanf("%d%d",&f,&t);
e[f].pb(mk(t,i));
e[t].pb(mk(f,i));
}
//cout<<st<<endl;
if(st==- && sum&)
{
puts("-1");
return ;
}
if(st==-) dfs(,-);
else dfs(st,-);
int len=ans.size();
sort(ans.begin(),ans.end());
printf("%d\n",len);
for(int i=;i<len;i++) printf("%d\n",ans[i]);
return ;
}
Codeforces Round #429 (Div. 2) - D Leha and another game about graph的更多相关文章
- 【推导】【DFS】Codeforces Round #429 (Div. 1) B. Leha and another game about graph
题意:给你一张图,给你每个点的权值,要么是-1,要么是1,要么是0.如果是-1就不用管,否则就要删除图中的某些边,使得该点的度数 mod 2等于该点的权值.让你输出一个留边的方案. 首先如果图内有-1 ...
- CodeForces 840B - Leha and another game about graph | Codeforces Round #429(Div 1)
思路来自这里,重点大概是想到建树和无解情况,然后就变成树形DP了- - /* CodeForces 840B - Leha and another game about graph [ 增量构造,树上 ...
- CodeForces 840A - Leha and Function | Codeforces Round #429 (Div. 1)
/* CodeForces 840A - Leha and Function [ 贪心 ] | Codeforces Round #429 (Div. 1) A越大,B越小,越好 */ #includ ...
- CodeForces 840C - On the Bench | Codeforces Round #429 (Div. 1)
思路来自FXXL中的某个链接 /* CodeForces 840C - On the Bench [ DP ] | Codeforces Round #429 (Div. 1) 题意: 给出一个数组, ...
- 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 解 只要不存在某个字母,它的 ...
- Codeforces Round #429 (Div. 2) 补题
A. Generous Kefa 题意:n个气球分给k个人,问每个人能否拿到的气球都不一样 解法:显然当某种气球的个数大于K的话,就GG了. #include <bits/stdc++.h> ...
- 【Codeforces Round #429 (Div. 2) C】Leha and Function
[Link]:http://codeforces.com/contest/841/problem/C [Description] [Solution] 看到最大的和最小的对应,第二大的和第二小的对应. ...
- 【CodeForces】841C. Leha and Function(Codeforces Round #429 (Div. 2))
[题意]定义函数F(n,k)为1~n的集合中选择k个数字,其中最小数字的期望. 给定两个数字集A,B,A中任意数字>=B中任意数字,要求重组A使得对于i=1~n,sigma(F(Ai,Bi))最 ...
- 【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,输出任意方案. [算法]数学+搜索 [题解] 最关 ...
随机推荐
- String split方法与Guava Splitter用法区别
String split方法与Guava Splitter用法区别 今天同事写了一段使用String split方法的代码,如下所示,同事期望得到的是字符"1",但是没想到却得到空 ...
- 【tomcat】sessionId学习(未完待续)
这里主要研究tomcat中session的管理方式以及sessionId的原理,下文将研究sessionid存到redis中以及基于redis实现session共享. 平时也就是了解session是基 ...
- Linux注销&登陆
⒈注销 ①在命令行使用logout,此指令在图形界面无效.
- argv[1] 路径问题
在看<学习opencv>一书时遇到一个小问题:函数只是通过argv传递参数来读取图片并显示,但是却一直弹出画布,没有图像. 如下:test.c # include<stdio.h&g ...
- API 开发平台 dreamfactory,参考SAWAGGER,国外厂家,开源,本地与云部署
API 开发平台,参考SAWAGGER,国外厂家,本地与云部署:参考 http://swagger.io/commercial-tools/ 1.dreamfactory 梦工厂公司 https: ...
- 【转】assert预处理宏与预处理变量
assert assert是一个预处理宏,由预处理器管理而非编译器管理,所以使用时都不用命名空间声明,如果你写成std::assert反而是错的.使用assert需要包含cassert或assert. ...
- mysql锁表与不锁表设置主从复制的方法
有时候MySQL主从同步不一致比较严重的时候,需要手动同步.先说说在锁表的情况下如何操作:以下是其简要过程 1.先对主库锁表FLUSH TABLES WITH READ LOCK; 2.备份数据mys ...
- 量化投资与Python之NumPy
数组计算 NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础.NumPy的主要功能:ndarray,一个多维数组结构,高效且节省空间无需循环对整组数据进行快速运算的 ...
- 017_mac格式化硬盘,mac如何格式化硬盘
想做一个mac和windows都能识别的系统,推荐设置成什么格式 一.在mac下格式化 在Mac 下,打开右下角应用程序-实用工具-磁盘工具,里面选取你的移动硬盘,然后进行格式化,设置成EXFat格式 ...
- Ex 5_22 在此我们基于以下性质给出一个新的最小生成树算法..._第九次作业
(a)设环的顶点集为V, e(u,v)为权最重的边,若把V分成两部分V1,V2.其中V1包含u,V2包含v,因为V是一个环,因此,至少存在两条把u和v连接起来的边.因此,除了e之外,至少还存在另一条边 ...