【题意】给定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 ;
}

最新文章

  1. Web 播放声音 — Flash 篇 (播放 AMR、WAV)
  2. Android 友盟分享躺过的几个坑,大坑,坑爹啊
  3. HTTP访问的两种方式(HttpClient+HttpURLConnection)整合汇总对比(转)
  4. Maven_非法字符: &#39;\ufeff&#39; 解决方案
  5. Windows环境下使用Redis缓存工具的图文详细方法
  6. (Forward) Music Player: From UI Proposal to Code
  7. IE11兼容性设定
  8. 【Python】python代码如何调试?
  9. yii多数据库
  10. ios 开源代码
  11. substr_replace()函数:将手机号中间4位隐藏为*号
  12. Java中equals和“==””的区别,String特殊
  13. 经验28--相关时间戳,C#
  14. 使用assets目录来实现插件机制
  15. border-raduis 在IE8中的兼容性问题
  16. 【菜鸟入门】安装配置eclipse 并编写运行第一个Java程序
  17. 敏捷冲刺每日报告五(Java-Team)
  18. 生产者消费者的java实现
  19. day6-基础函数的学习(一)
  20. python网络编程(二)

热门文章

  1. OrCAD生成网表
  2. 【MVC】 小问题
  3. 01-Mysql数据库----前戏
  4. 数据结构(python语言)目录链接
  5. UVa 294 - Divisors 解题报告 c语言实现 素数筛法
  6. SPFA模板 Bellmanford优化版
  7. php+Mysql中网页出现乱码的解决办法详解
  8. java中使用POI+excel 实现数据的批量导入和导出
  9. el-input为数字时验证问题
  10. 制作用于日期时间型字段的DELPHI数据感知控件