[图论:选边满足各点度的奇偶] CF 840B
来源:互联网 发布:五线谱转简谱软件 编辑:程序博客网 时间:2024/05/20 17:27
B. Leha and another game about graph
time limit per test3 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Leha plays a computer game, where is on each level is given a connected graph with n vertices and m edges. Graph can contain multiple edges, but can not contain self loops. Each vertex has an integer di, which can be equal to 0, 1 or - 1. To pass the level, he needs to find a «good» subset of edges of the graph or say, that it doesn’t exist. Subset is called «good», if by by leaving only edges from this subset in the original graph, we obtain the following: for every vertex i, di = - 1 or it’s degree modulo 2 is equal to di. Leha wants to pass the game as soon as possible and ask you to help him. In case of multiple correct answers, print any of them.
Input
The first line contains two integers n, m (1 ≤ n ≤ 3·105, n - 1 ≤ m ≤ 3·105) — number of vertices and edges.
The second line contains n integers d1, d2, …, dn ( - 1 ≤ di ≤ 1) — numbers on the vertices.
Each of the next m lines contains two integers u and v (1 ≤ u, v ≤ n) — edges. It’s guaranteed, that graph in the input is connected.
Output
Print - 1 in a single line, if solution doesn’t exist. Otherwise in the first line k — number of edges in a subset. In the next k lines indexes of edges. Edges are numerated in order as they are given in the input, starting from 1.
Examples
input
1 0
1
output
-1
input
4 5
0 0 0 -1
1 2
2 3
3 4
1 4
2 4
output
0
input
2 1
1 1
1 2
output
1
1
input
3 3
0 -1 1
1 2
2 3
1 3
output
1
2
Note
In the first sample we have single vertex without edges. It’s degree is 0 and we can not get 1.
这个题的思路比较好,dfs,根据其条件根据已经走过的边的条件判断,具体看注释
#include<iostream>#include<string>#include<vector>#include<algorithm>#include<queue>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<stack>#include<set>#include<iomanip>//#define mem(dp,a) memset(dp,a,sizeof(dp))//#define fo(i,n) for(int i=0;i<(n);i++)//#define INF 0x3f3f3f3f#define fread() freopen("data.txt","r",stdin)#define fwrite() freopen("out.out","w",stdout)using namespace std;typedef long long ll;const ll N = 300005;const ll MOD = 1000000007;int n,m;int d[N];int ed_in[N];vector< pair<int,int> > e[N];vector<int> ans;bool vis[N];void dfs(ll x,ll pre=0,ll e_id=0){ vis[x] = 1; bool deg = 0;//判断连边的奇偶 for(auto u:e[x]) { if(vis[u.first]) continue; dfs(u.first,x,u.second); if(ed_in[u.second] == 1) { deg = !deg; } } //根据后面的状态来转移 if(d[x] == -1 || deg == d[x]) return ; //如果不满足条件就加一条边 ed_in[e_id] = 1; if(e_id!=0) ans.push_back(e_id);}int main(){ int u,v; int sum = 0,di = -1; ios_base::sync_with_stdio(false);// fread(); cin >> n>> m; for(int i=1;i<=n;i++) { cin >> d[i]; sum += d[i]; if(d[i] == -1) di = i; } for(int i=1;i<=m;i++) { cin >> u >> v; e[u].push_back({v,i}); e[v].push_back({u,i}); } if(di!=-1) dfs(di); else if(sum%2) return cout<<"-1\n",0; else dfs(1); cout <<ans.size()<<endl; sort(ans.begin(),ans.end()); for(auto x:ans) { cout <<x<<endl; } return 0;}
- [图论:选边满足各点度的奇偶] CF 840B
- CF/257/B/图论
- 奇偶剪枝问题 深搜搜到满足条件的路径时,不再搜其他路径
- cf-B
- cf B
- CF 304B(Calendar-一段时间的日期)
- 输出满足n=a!+b!+c!的所有三位数
- 输出满足2a=b的数对
- 找出唯一的满足a + b + c = 1000的毕达哥拉斯三元组{a, b, c}。
- YT14-HDU-满足(a^2+b^2 +m)/(ab)的(a,b)有多少
- 给定正整数b,求最大的整数a,满足a*(a+b) 为完全平方数
- oracle触发器 判断插入的记录是否满足条件,如果满足,则在b表中插入相应记录
- CF 453B(Little Pony and Harmony Chest-数列最小加减1更改方案,满足任意2数互质-位运算dp+最坏情况分析+记忆化搜索)
- CF 1B Spreadsheet
- CF 3B Lorry
- CF 176B
- CF 91B
- cf 131 DIV2 B
- 8.18 G
- javaWeb:session共享
- 挖掘算法中的数据结构(三):O(n*logn)排序算法之 快速排序(随机化、二路、三路排序) 及衍生算法
- Java开发OCR文字识别系统
- Pokémon GO
- [图论:选边满足各点度的奇偶] CF 840B
- Django 缓存 使用 Redis Memcached 为网站提速
- js原生实现jquery方法offset()和position()
- 实现
- matlab控制运算精度函数digits(A)和vpa(B)的使用方法
- 关于有偿提供拼图响应式后台的通知
- 如何移除解决方案中的TFS版本控制
- 【Codeforces 840 A. Leha and Function】& 构造
- JSON和JSONP,也许你会豁然开朗