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;
}
思路:每个点最好只处理一次这样既方便又快捷 而如果最下面的叶子节点 是粉色 肯定要过去的 到达底部要 回溯回去 同理先处理好他的所有子树
如果是粉树 那么直接回去涂起来
如果是黑树(如果根节点就直接结束了) 那么最后自己由于不知道现在是不是最后一个点要涂 所以我们把先到这个点 再去父亲节点 再回来 那么就成功的跳过了这个点
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;
}
相关文章推荐
- 「CodeForces - 717E」Paint it really, really dark gray (dfs)
- [构造] Codeforces 717E Bubble Cup 9 - Finals E. Paint it really, really dark gray
- [树的dfs] Codeforces 717 E. Paint it really, really dark gray
- [CF717E]Paint it really, really dark gray(dfs,构造)
- 【DFS】Codeforces717E[Paint it really, really dark gray]题解
- 【DFS】Codeforces 717E Paint it really, really dark gray
- [dfs] Codeforces717E. Paint it really, really dark gray
- codeforces717E Paint it really, really dark gray(树上dfs)
- Codeforces 807 A Is it rated?
- 小白题解 Codeforces 807A Is it rated?
- OpenStack, What it really is?
- 「Codeforces 464D」World of Darkraft - 2
- Codeforces 468C Hack it!
- Codeforces 330E Graph Reconstruction【随机化算法】Get it!
- Foolproof Acne Medicine - Does it Really Exist?
- What it really is, not what it is
- Integer.parse was not used because it's not really I18N-safe
- CodeForces 468C Hack it![数学]
- 【CODEFORCES】 C. Design Tutorial: Make It Nondeterministic
- Secondary Namenode - What it really do?