您的位置:首页 > 大数据 > 人工智能

codeforces 717E - Paint it really, really dark gray

2016-09-15 18:17 405 查看
题意:给你一颗树 每个节点有黑色 或者 粉色 现在从第一个节点出发 每次经过一个节点 就把他颜色变成另一种颜色 求问全部颜色变成黑色的路径 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: