C. Cut 'em all!

题目链接: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进行搜索,判断每一个父亲节点中儿子节点的个数,然后在进一步进行判断。

猜你喜欢

转载自blog.csdn.net/let_life_stop/article/details/80455925