题意:一颗树,每条边有个颜色,一条路径被定义为“彩虹”,当且仅当其上没有长度大于等于2的同色子路径。一个结点被定义为“超级结点”,当且仅当从其发出的所有路径都是“彩虹”。

枚举所有长度为2,且同色的路径,其两端点方向发出的子树中的结点都不可能成为答案,只需要将它们覆盖掉即可,用dfs序处理,在左端点+1,右端点-1,最后求个前缀和,为0的结点就是没有被覆盖过的结点,也即“超级结点”。

分两种情况:这两条边深度相同;这两条边深度不同。

#include<cstdio>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
int n;
int c[50005],Map[50005];
int fa[50005],first[50005],nex[100005],v[100005],e,Ls[50005],Rs[50005],tot,w[100005];
int fav[50005];
void AddEdge(int U,int V,int W){
v[++e]=V;
w[e]=W;
nex[e]=first[U];
first[U]=e;
}
void df1(int U){
Ls[U]=++tot;
Map[tot]=U;
for(int i=first[U];i;i=nex[i]){
if(!fa[v[i]]){
fa[v[i]]=U;
fav[v[i]]=w[i];
df1(v[i]);
}
}
Rs[U]=tot;
}
void fugai(int L,int R){
++c[L];
if(R!=n){
--c[R+1];
}
}
void fugai2(int L,int R){
if(L!=1){
++c[1];
--c[L];
}
if(R!=n){
++c[R+1];
}
}
void dfs(int U){
for(int i=first[U];i;i=nex[i]){
if(fa[v[i]]==U){
if(U!=1 && fav[U]==w[i]){
fugai(Ls[v[i]],Rs[v[i]]);
fugai2(Ls[U],Rs[U]);
}
dfs(v[i]);
}
}
}
void df2(int U){
map<int,int>cnts;
for(int i=first[U];i;i=nex[i]){
if(fa[v[i]]==U){
++cnts[w[i]];
}
}
for(int i=first[U];i;i=nex[i]){
if(fa[v[i]]==U){
if(cnts[w[i]]>1){
fugai(Ls[v[i]],Rs[v[i]]);
}
df2(v[i]);
}
}
}
int main(){
//freopen("g.in","r",stdin);
scanf("%d",&n);
int x,y,z;
for(int i=1;i<n;++i){
scanf("%d%d%d",&x,&y,&z);
AddEdge(x,y,z);
AddEdge(y,x,z);
}
fa[1]=-1;
df1(1);
dfs(1);
df2(1);
vector<int>vs;
for(int i=1;i<=n;++i){
c[i]+=c[i-1];
//printf("%d ",c[i]);
if(!c[i]){
vs.push_back(Map[i]);
}
}
//puts("");
printf("%d\n",vs.size());
sort(vs.begin(),vs.end());
for(vector<int>::iterator it=vs.begin();it!=vs.end();++it){
printf("%d\n",*it);
}
return 0;
}

最新文章

  1. Ubuntu12.04安装到U盘里
  2. PRML读书会第五章 Neural Networks(神经网络、BP误差后向传播链式求导法则、正则化、卷积网络)
  3. OD调试篇10
  4. TOP30专访:捕鱼达人陈昊芝
  5. poj2286The Rotation Game(迭代加深dfs)
  6. 框架学习之道:PE框架简介
  7. net搭建热插拔式web框架(沙箱的构建)
  8. 一步一个坑 - WinDbg调试.NET程序
  9. Frogger POJ - 2253
  10. jdbc和odbc
  11. [dev][dpdk][crypto] dpdk加解密设备与IPSEC
  12. C++ Exception机制
  13. java中equals,hashcode和==的区别
  14. python静态方法、类方法
  15. es的mapping设置
  16. AngularJS 承诺 Promise
  17. Mysql学习---面试基础知识点总结
  18. mongo文件空间
  19. python学习笔记06-enumerate()
  20. WebGL——osg框架学习四

热门文章

  1. 面试整理(3)js事件委托
  2. LintCode题解之子树
  3. Oracle笔记之用户管理
  4. VScode格式化ESlint
  5. 73.Vivado使用误区与进阶——在Vivado中实现ECO功能
  6. jsonpath for js
  7. PostGreSQL数据库安装配置说明
  8. Jmeter中的变量(三)
  9. 常用开放api【长期更新】
  10. 06易普优APS行业方案:包装印刷行业高级计划排程