【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,输出任意方案。
【算法】数学+搜索
【题解】
最关键的一步:★【%2转取反】。
首先考虑在树上做这样的问题,就显得十分朴素了。每当选择一条边,边的两端点权值就会取反,所以做一次DFS,对儿子权值(变化后)为1的点连边,自身取反,儿子都处理完毕后再把自身的新权值反馈上去。这样本质上等同于,所有点权为1的点都通过路径将取反信息传递到根,若最终根权为0则问题解决且得到一种路径方案,若根权为1则需要换一个di=-1的点作为根重新dfs,若无则无解。(实际操作中直接先找-1的点DFS,没有再找任意一个判断有无解)
最后考虑图转树的正确性,需要论证一下两点:
1.图上的环没有影响:对于一个环,环边对环中所有点的度均为2,此时可以一起删去则模2不受影响。
2.图转成任意生成树没有影响:因为转成树后不管树长成什么样,都是所有的di=1的点在传递信息,简单的说,答案有解当且仅当【di=1的点为偶数个】或【di=1的点为奇数个且存在di=-1的点】,所以生成树的形态只是为了找到一个可行方案来输出,不会影响答案。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=;
struct edge{int v,from;}e[maxn*];
int first[maxn],d[maxn],n,m,ans=,tot=;
bool vis[maxn],a[maxn*]; void insert(int u,int v){
tot++;e[tot].v=v;e[tot].from=first[u];first[u]=tot;
tot++;e[tot].v=u;e[tot].from=first[v];first[v]=tot;
}
int dfs(int x){
vis[x]=;
for(int i=first[x];i;i=e[i].from)if(!vis[e[i].v]){
if(dfs(e[i].v)&){
a[i]=;ans++;
if(d[x]!=)d[x]=-d[x];
}
}
return d[x];
}
int main(){
scanf("%d%d",&n,&m);
int point=;
for(int i=;i<=n;i++){scanf("%d",&d[i]);if(d[i]==-)point=i,d[i]=;}
int u,v;
for(int i=;i<=m;i++){
scanf("%d%d",&u,&v);
insert(u,v);
}
if(point)dfs(point);
else if(dfs()&){printf("-1");return ;}
printf("%d\n",ans);
for(int i=;i<=tot;i+=)if(a[i]||a[i+])printf("%d ",(i+)/);
return ;
}
【CodeForces】841D. Leha and another game about graph(Codeforces Round #429 (Div. 2))的更多相关文章
- 【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))最 ...
- 【动态规划】Vijos P1313 金明的预算方案(NOIP2006提高组第二题)
题目链接: https://vijos.org/p/1313 题目大意: m(m<=32000)金钱,n(n<=60)个物品,花费vi,价值vi*ci,每个物品可能有不超过2个附件,附件没 ...
- 【转载】一分钟了解两阶段提交2PC(运营MM也懂了)
上一期分享了"一分钟了解mongoDB"[回复"mongo"阅读],本期将分享分布式事务的一种实现方式2PC. 一.概念 二阶段提交2PC(Two phase ...
- (原创)【MAUI】一步一步实现“悬浮操作按钮”(FAB,Floating Action Button)
一.前言 MAUI,跨平台的 GUI 框架,基本介绍本文不再赘述. 话不多说,既然可以跨平台,那么我们就来实现一个在移动端很常用的控件:悬浮操作按钮(FAB,Floating Action Butto ...
- 【BZOJ-2502】清理雪道 有上下界的网络流(有下界的最小流)
2502: 清理雪道 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 594 Solved: 318[Submit][Status][Discuss] ...
- 【转】浅谈Java中的hashcode方法(这个demo可以多看看)
浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...
- 【HTML5】HTML5中video元素事件详解(实时监测当前播放时间)
html 代码..video后边几个元素,可处理ios 系统的兼容性 <video id="myVideo" controls="controls" po ...
- 【PHP】php生成一个不重复的数字(订单号、会员号)
1.目的:利用php的do .. while 生成一个不重复的字符串或者数组,比如(订单号.会员号) 2.不废话,代码来: $repeat_order = array(); do{ $ordersn ...
- 【jQuery】学习jQuery插件的使用与写法(表单验证插件-validation)
最新最全的插件可以从jQuery官方网站的插件板块下载,网站地址为:http://plugins.jquery.com/ Validation优点:内置验证规则:自定义验证规则:简单强大的验证信息提示 ...
随机推荐
- PHP通过copy()函数来复制一个文件
PHP通过copy()函数来复制一个文件.用法如下: bool copy(string $source, string $dest) 其中$source是源文件的路径,$dest是目的文件的路径.函数 ...
- mysql 处理日期格式
DATE_FORMAT(createTime,'%Y-%m-%d %H:%i:%s') 对应格式: 2018-12-17 17:33:43 DATE_FORMAT()函数所有格式: 以后有需要在自 ...
- 讨伐Cucumber行为驱动
Cucumber行为驱动,简称BDD,其核心思想是把自然语言转换成代码:但在敏捷开发的过程中,这种东西极大的束缚了测试人员的手脚,感觉它像封建时代的八股文,要遵守严格的韵律,反正我个人十分反感:就像在 ...
- 安装QC的心(新)路历程 纯记录 无技术
之前就只是看来软件测试原书第二版学习力理论知识,关于书中提到的缺陷管理工具,测试管理工具等也没有亲自去安装使用,感觉太不应该了.于是我就上网了解了一些测试管理工具后,决定先选择QC来学习.说实话,当初 ...
- Sql面试题之三(难度:简单| 含答案)
Sql面试题之三(难度:简单| 含答案) 答案: .SELECT B.name, B.Depart T.Content FROM B, T WHERE ( T.Content = '税法培训' and ...
- 为什么logstash进程的CPU使用率100%?
机器上有个进程cpu使用率很高,近100%了, Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie%Cpu(s): 99.0 ...
- 可以随着SeekBar滑块滑动显示的Demo
//关于Seek的自定义样式,之前也有总结过,但是,一直做不出随着滑块移动的效果,查询了很多资料终于解决了这个问题,现在把代码写出来有bug的地方 希望大家批评指正. Step 1 :自定义一个Vie ...
- 以太坊 生成助记词和infuru插件
https://iancoleman.io/bip39/ https://infura.io google faucet : https://faucet.rinkeby.io/ 登录google账号 ...
- beta版本冲刺三
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- Hibernate关联映射之_多对一
多对一 Employee-Department 对于 员工 和 部门 两个对象,从员工的角度来看,就是多对一的一个关系--->多个员工对应一个部门 表设计: 部门表:department,id主 ...