题意:给你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[u]=1;
int sum=0,num=0;
for(int i=0;i<vt[u].size();i++)
{
int to=vt[u][i].to;
if(to==fa)continue;
num++;
sum+=(dp[to]&&f[to]);
}
for(int i=0;i<

博客探讨了Codeforces Gym-101617G问题,该问题涉及一棵边有颜色的树,目标是找出所有路径上相邻边颜色不同的节点。文章通过树形动态规划(DP)方法进行求解,首先预处理每个节点到其子节点的路径,然后使用深度优先搜索(DFS)判断节点是否符合条件,即父节点连接的边颜色与其它边不同,且所有子路径满足要求。
最低0.47元/天 解锁文章
869

被折叠的 条评论
为什么被折叠?



