首页 > 其他分享 >E. Count Paths

E. Count Paths

时间:2024-07-13 10:59:21浏览次数:5  
标签:Count Paths 结点 颜色 int dfs color num

原题链接

题解

前言:这题可以只调用一遍dfs。

首先,以颜色为color_u的u为根结点的子树内,颜色与u颜色相同的结点 不能与u的其余子树中颜色为color_u的结点相连接。

我们需要一个num数组,num[i]表示当前结点 i ,有多少个结点可以与他连接。

接下来,我们任取一个结点为根结点去跑dfs。假设当前在 i 结点,在每次遍历一条子路径时,将num[i]取1,在退出当前结点时num[i]恢复并+1。

具体思想和细节可以看code

code

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
const int M=4e5+5;
int head[N],Next[M],to[M],cnt=1,color[N],vis[N];
ll ans=0,num[N];
void Init(int n){
    for (int i=1;i<=n;i++){
        head[i]=0;
        num[i]=0;
        vis[i]=0;
    }
    cnt=1;
    ans=0ll;
}
void build(int from,int to_){
    Next[cnt]=head[from];
    to[cnt]=to_;
    head[from]=cnt++;
}
void dfs(int tree){
    if (vis[tree]) return;
    vis[tree]=1;
    int c=color[tree];
    ll x=num[c];
    ans+=x;
    for (int i=head[tree];i>0;i=Next[i]){
        num[c]=1;   //每次遍历子树都要将根结点的颜色变 1 
        dfs(to[i]);
    }
    num[c]=x+1ll;
    vis[tree]=0;
}
int main(){
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while (t--){
        int n;
        cin>>n;
        Init(n);
        for (int i=1;i<=n;i++) cin>>color[i];
        for (int i=1,u,v;i<n;i++){
            cin>>u>>v;
            build(u,v);
            build(v,u);
        }
        dfs(1);
        cout<<ans<<endl;
    }
    return 0;
}

 

标签:Count,Paths,结点,颜色,int,dfs,color,num
From: https://www.cnblogs.com/purple123/p/18299784

相关文章

  • E. Count Paths
    原题链接题解对于这种无序点对统计问题,我们可以遍历每一个点,然后计算其与之前遍历过的点的配对\(dfs\)遍历,设\(num[i]\)代表遍历到当前节点时,有多少可与当前节点配对的、节点颜色为\(i\)的、且\(dfs\)序小于当前节点(即之前遍历过的)的节点维护方法:每往子节点遍历,由于子......
  • 1004 Counting Leaves(dfs):邻接表版:写的太多了
    Afamilyhierarchyisusuallypresentedbyapedigreetree.Yourjobistocountthosefamilymemberswhohavenochild.InputSpecification:Eachinputfilecontainsonetestcase.Eachcasestartswithalinecontaining0<N<100,thenumberofnode......
  • C. Count Triangles
    原题链接题解我们知道,三角形成立的条件是任意两边之和都要大于第三边,因为这里已经明确了三条边的大小关系,即\(x\leqy\leqz\)所以,该三角形成立的条件是\(x+y>z\)看到\(5e5\)我们不难想到遍历其中某条边的长度这里我遍历的是\(y\)遍历\(y\),找到最小的\(x\)使得至少......
  • [题解] [ABC221H] Count Multiset - DP
    [ABC221H]CountMultiset题面翻译输入两个正整数\(N,M\),并存在一个集合,问你一个长度为\(k\)的合法集合存在多少个?你需要回答\(k\)的值为\(1\)到\(N\)的每种情况。一个合法的集合定义指长度为\(k\),元素和为\(N\),每一个数字在集合中出现的次数都小于等于\(M\)的集......
  • 解析Count函数
    #count(*),count(主键),count(字段)和count(1)有什么区别?哪个性能最好?绝对不是count(*)最慢!哪种count性能最好?我先直接说结论:要弄明白这个,我们得要深入count的原理,以下内容基于常用的innodb存储引擎来说明。count()是什么?count()是一个聚合函数,函数的参数不......
  • 【转】-Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
    Java并发编程:CountDownLatch、CyclicBarrier和Semaphore该博客转载自​Matrix海子​的​Java并发编程:CountDownLatch、CyclicBarrier和Semaphore在java1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下......
  • 【转】-Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
    Java并发编程:CountDownLatch、CyclicBarrier和Semaphore该博客转载自​Matrix海子​的​Java并发编程:CountDownLatch、CyclicBarrier和Semaphore在java1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下......
  • 【转】-CountDownLatch详解
    CountDownLatch详解该博客转载自​爱宝贝丶的​CountDownLatch详解1.简介CountDownLatch中countdown是倒数的意思,latch则是门闩的含义。整体含义可以理解为倒数的门栓,似乎有一点“三二一,芝麻开门”的感觉。CountDownLatch的作用也是如此,在构造CountDownLatch的时候需要传入......
  • 思考 Count The Repetitions,谈谈对 T2乒乒球的认识
    思考什么什么不写题意共记录了\(n\)颗球胜负关系,给出\(n\)和其长度为\(k\)的循环节,求最终比分。思路首先特判答案为\(0:0\)的情况:循环节与AB或ABBA同构。然后暴力找比分的周期,因为令任意位置作为一局起点时该局终点唯一,反之亦然,所以复杂度\(O(\left|state\ri......
  • LDAP 用户帐户控制 UserAccountControl 详解
    属性标志十六进制值十进制值属性标志说明SCRIPT0x00011将运行登录脚本ACCOUNTDISABLE0x00022已禁用用户帐户HOMEDIR_REQUIRED0x00088需要主文件夹LOCKOUT0x001016 PASSWD_NOTREQD0x002032无需密码PASSWD_CANT_CHANGE0x004064用户无法更改......