题意:给你n个点的树,每条边有一种颜色,定义一个点是符合要求的:以他为起点的所有路径都满足,每条路径上相邻边的颜色是不同的。求所有满足要求的点。
题解:首先dp预处理出所有点往儿子节点的路径是否都满足要求,dp[i]==1表示满足要求。然后dfs,假设当前结点的父节点是可行的,那么这个节点与父节点的连边与父节点其他边颜色都不一样,并且父节点到其他子节点的路径都满足要求,那么这个点就是可行点。
AC代码:
#include<stdio.h>
#include<vector>
using namespace std;
struct node
{
int to,col;
node(){}
node(int to,int col)
{
this->to=to;
this->col=col;
}
}F[50005];
vector<node>vt[50005];
int dp[50005],f[50005],mark[50005],shang[50005];
int ans[50005];
void dfs(int u,int fa,int col)
{
dp[u]=f[u]=1;
F[u]=node(fa,col);
for(int i=0;i<vt[u].size();i++)
{
int to=vt[u][i].to;
if(to==fa)continue;
if(col==vt[u][i].col)f[u]=0;
dfs(to,u,vt[u][i].col);
if(dp[to]==0||f[to]==0)dp[u]=0;
}
}
void dfs2(int u,int fa)
{
if(dp[u])ans[