codeforces 717E - Paint it really, really dark gray

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011528035/article/details/52550439

题意:给你一颗树 每个节点有黑色 或者 粉色 现在从第一个节点出发 每次经过一个节点 就把他颜色变成另一种颜色 求问全部颜色变成黑色的路径 spj


思路:每个点最好只处理一次这样既方便又快捷  而如果最下面的叶子节点 是粉色 肯定要过去的  到达底部要 回溯回去   同理先处理好他的所有子树 

如果是粉树 那么直接回去涂起来

如果是黑树(如果根节点就直接结束了) 那么最后自己由于不知道现在是不是最后一个点要涂 所以我们把先到这个点 再去父亲节点 再回来 那么就成功的跳过了这个点


ps:题目的Jaggy 是什么东西??


#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;

#define LL long long
#define MAX 200100
#define MID 150000
#define MOD 100000000

vector<int> e[MAX];
int ans[MAX];
int a[MAX];
int cnt;

//int t[MAX];

int dfs(int x,int fa)
{
    ans[cnt++]=x;
    int flag=0;
    for(int i=0;i<e[x].size();i++)
    {
        int to=e[x][i];
        if(to==fa)continue;
        if(dfs(to,x))
        {
            ans[cnt++]=x;
            a[x]^=1;
            flag=1;
        }
    }

    if(x==1&&!flag&&a[x])
    {
        int to=e[x][0];
        printf("%d %d %d %d",x,to,x,to);
    }
    
    
    else if((x!=1&&a[x])||(x==1&&!a[x]))
    {
        for(int i=0;i<cnt;i++)
        {
            printf("%d ",ans[i]);
        //    t[ans[i]]++;
        }
        cnt=0;
        flag=1;
    }
    else if(flag)
    {
        a[fa]^=1;
        ans[cnt++]=fa;
        ans[cnt++]=x;
    }
    else
        cnt--;
    return flag;
}

int main()
{
    int n,x,y;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        a[i]=1-(a[i]==1);
    }
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        e[x].push_back(y);
        e[y].push_back(x);
    }
    dfs(1,1);
    printf("\n");
/*
    for(int i=1;i<=n;i++)
    {
        if(t[i])
            printf("*****%d %d\n",i,t[i]);
    }*/
    return 0;
}



猜你喜欢

转载自blog.csdn.net/u011528035/article/details/52550439