题目链接:http://codeforces.com/contest/982/problem/C
题目大意:就是先给出n个节点,然后再给出n条边,再判断最少去掉多少条边能使剩下的相连的是偶数。
具体思路:首先建立好对应关系,然后再进行dfs。判断每一个父亲节点的子节点的个数是不是偶数,如果是偶数就可以砍掉,如果不是偶数,则不可以砍掉。
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
vector<int>q[maxn];
int dis[maxn];
int ans;
void dfs(int t1,int t2)
{
dis[t1]=1;
for(auto x:q[t1])
{
if(x==t2)continue;
dfs(x,t1);
dis[t1]+=dis[x]//不停地往下找,直到找到没法再找时,停止。然后再逐步递归回去,对于每一个父亲节点进行判断。
}
if(dis[t1]%2==0) ans++,dis[t1]=0;
}
int main()
{
ans=0;
memset(dis,0,sizeof(dis));
int n;
cin>>n;
for(int i=1; i<=n-1; i++)
{
int a,b;
cin>>a>>b;
q[a].push_back(b);
q[b].push_back(a);
}
dfs(1,-1);
if(n&1)//判断奇数的方法,如果是奇数,就输出-1
cout<<-1<<endl;
else
cout<<ans-1<<endl;
return 0;
}
这个代码是在别人的指导下写成的,首先运用了vector容器,解决了父亲节点和儿子节点的问题,然后再用dfs进行搜索,判断每一个父亲节点中儿子节点的个数,然后在进一步进行判断。