题目链接:http://codeforces.com/contest/841/problem/D
题意:给你一个n个点m条边的联通无向图,有重边无自环,每个点有一个权值d,d[i]={-1,0,1},要求在图中选择一些边使得对于图中的任意点 i 有度数x%2==d[i]或者d[i]==-1.
思路:考虑一条边都不选的时候,那么d[i]==1的点将不满足要求,我们就必须要给它加一条边。如果我们用dfs来维护这个过程,对于d[i]>=0的点,添边的过程实际上是d[i]取反的过程,我们从叶子结点向上搜索,对于每一棵子树u(u为父节点),如果u的子节点v d[v]==1,我们就在u和v之间连一条边,表现为d[u](d[u]!=-1)和d[v]取反,由于对一个节点进行取反并不影响他的子节点的状态,所以当我们将这个过程进行完毕后只有根节点的状态是不确定的,那么对于根节点u,如果d[u]==0或者d[u]==-1,那么此时选取的边已经符合要求,如果d[u]==1,考虑如果它的所有子节点中,存在一点x d[x]==-1,那么我们遍历从x到u的路径,并沿途取反,此时这条路径上只有u的状态会发生改变,其他的状态均不会发生改变,此时d[u]==0,符合题意要求,输出即可。因此输出-1的条件就