Codeforces Round 548 (Div. 2) C. Edgy Trees

Edgy Trees

time limit per test: 2 second
memory limit per test: 256 megabytes
input: standard input
output: standard output

You are given a tree (a connected undirected graph without cycles) of n n n vertices. Each of the n − 1 n - 1 n1 edges of the tree is colored in either black or red.

You are also given an integer k k k. Consider sequences of k k k vertices. Let’s call a sequence [ a 1 , a 2 , … , a k ] [a_1, a_2, \ldots, a_k] [a1,a2,,ak] good if it satisfies the following criterion:

  • We will walk a path (possibly visiting same edge/vertex multiple times) on the tree, starting from a 1 a_1 a1 and ending at a k a_k ak.
  • Start at a 1 a_1 a1, then go to a 2 a_2 a2 using the shortest path between a 1 a_1 a1 and a 2 a_2 a2, then go to a 3 a_3 a3 in a similar way, and so on, until you travel the shortest path between a k − 1 a_{k-1} ak1 and a k a_k ak.
  • If you walked over at least one black edge during this process, then the sequence is good.

Consider the tree on the picture. If k = 3 k=3 k=3 then the following sequences are good: [ 1 , 4 , 7 ] [1, 4, 7] [1,4,7], [ 5 , 5 , 3 ] [5, 5, 3] [5,5,3] and [ 2 , 3 , 7 ] [2, 3, 7] [2,3,7]. The following sequences are not good: [ 1 , 4 , 6 ] [1, 4, 6] [1,4,6], [ 5 , 5 , 5 ] [5, 5, 5] [5,5,5], [ 3 , 7 , 3 ] [3, 7, 3] [3,7,3].

There are n k n^k nk sequences of vertices, count how many of them are good. Since this number can be quite large, print it modulo 1 0 9 + 7 10^9+7 109+7.

Input

The first line contains two integers n n n and k k k ( 2 ≤ n ≤ 1 0 5 2 \le n \le 10^5 2n105, 2 ≤ k ≤ 100 2 \le k \le 100 2k100), the size of the tree and the length of the vertex sequence.

Each of the next n − 1 n - 1 n1 lines contains three integers u i u_i ui, v i v_i vi and x i x_i xi ( 1 ≤ u i , v i ≤ n 1 \le u_i, v_i \le n 1ui,vin, x i ∈ { 0 , 1 } x_i \in \{0, 1\} xi{0,1}), where u i u_i ui and v i v_i vi denote the endpoints of the corresponding edge and x i x_i xi is the color of this edge ( 0 0 0 denotes red edge and 1 1 1 denotes black edge).

Output

Print the number of good sequences modulo 1 0 9 + 7 10^9 + 7 109+7.

Example

i n p u t \tt input input
4 4
1 2 1
2 3 1
3 4 1
o u t p u t \tt output output
252
i n p u t \tt input input
4 6
1 2 0
1 3 0
1 4 0
o u t p u t \tt output output
0
i n p u t \tt input input
3 5
1 2 1
2 3 0
o u t p u t \tt output output
210

Note

In the first example, all sequences ( 4 4 4^4 44) of length 4 4 4 except the following are good:

  • [ 1 , 1 , 1 , 1 ] [1, 1, 1, 1] [1,1,1,1]
  • [ 2 , 2 , 2 , 2 ] [2, 2, 2, 2] [2,2,2,2]
  • [ 3 , 3 , 3 , 3 ] [3, 3, 3, 3] [3,3,3,3]
  • [ 4 , 4 , 4 , 4 ] [4, 4, 4, 4] [4,4,4,4]

In the second example, all edges are red, hence there aren’t any good sequences.

Tutorial

由于题目要求中有至少走过一条黑边,所以我们可以用正难则反的思想,求出所有坏序列,即一条黑边也没有,最后再用所有序列减去坏序列即为结果

首先我们可以将黑边删除,剩下的都将是红边连接的分块,对于每个分块,它们自身元素的连接均为坏序列,序列个数为 s z k sz^k szk,其中 z s zs zs​ 为当前分块的节点个数,此时想要建成好序列就需要与其他分块相连,即通过一条黑边

由于所有的序列个数为 n k n^k nk,所以最终答案为 n k − ∑ z s k n^k - \sum zs^k nkzsk,其中 s z sz sz 为当前分块的节点个数

此解法时间复杂度为 O ( α ( n ) ) \mathcal O(\alpha(n)) O(α(n)),即并查集的时间复杂度

Solution

#include <bits/stdc++.h>
using namespace std;

#define endl '\n'
#define int long long
const int mod = 1e9 + 7; // 998244353;

struct DSU { // 并查集
    vector<int> pre, siz;
    
    DSU() {}
    DSU(int n) {
        pre.resize(n + 1);
        std::iota(pre.begin(), pre.end(), 0);
        siz.assign(n + 1, 1);
    }
    
    int find(int x) {
        if (pre[x] == x) {
            return x;
        }
        return pre[x] = find(pre[x]);
    }
    
    bool same(int x, int y) {
        return find(x) == find(y);
    }
    
    bool merge(int x, int y) {
        x = find(x);
        y = find(y);
        if (x == y) {
            return false;
        }
        siz[x] += siz[y];
        pre[y] = x;
        return true;
    }
    
    int size(int x) {
        return siz[find(x)];
    }
};

int ksm(int x, int y, int mod) {
    x %= mod;
    int ans = 1;
    while (y) {
        if (y & 1) {
            ans = (ans * x) % mod;
        }
        x = (x * x) % mod;
        y >>= 1;
    }
    return ans;
}

signed main() {
    int n, k;
    cin >> n >> k;
    int ans = ksm(n, k, mod);
    DSU dsu(n);
    vector<int> memo(n + 1);
    for (int i = 1; i < n; ++i) {
        int u, v, x;
        cin >> u >> v >> x;
        if (not x) {
            dsu.merge(u, v);
        }
    }
    for (int i = 1; i <= n; ++i) {
        if (not memo[dsu.find(i)]) {
            ans -= ksm(dsu.size(i), k, mod);
            ans = (ans + mod) % mod;
            memo[dsu.find(i)] = 1;
        }
    }
    cout << ans << endl;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/671521.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计 | SpringBoot招投标系统 任务发布网站(附源码)

1&#xff0c;绪论 在市场范围内&#xff0c;任务发布网站很受欢迎&#xff0c;有很多开发者以及其他领域的牛人&#xff0c;更倾向于选择工作时间、工作场景更自由的零工市场寻求零散单子来补贴家用。 如今市场上&#xff0c;任务发布网站鱼龙混杂&#xff0c;用户需要找一个…

【TCP协议中104解析】wireshark抓取流量包工具,群殴协议解析基础

Tcp ,104 ,wireshark工具进行解析 IEC104 是用于监控和诊断工业控制网络的一种标准&#xff0c;而 Wireshark则是一款常用的网络协议分析工具&#xff0c;可以用干解析TEC104 报文。本文将介绍如何使用 Wireshark解析 IEC104报文&#xff0c;以及解析过 程中的注意事项。 一、安…

STL-queue的使用及其模拟实现

在C标准库中&#xff0c;队列(queue)是一种容器适配器&#xff0c;它以先进先出的方式组织数据&#xff0c;其中从容器一端插入元素&#xff0c;另一端取出元素。 queue的使用 queue的构造函数 queue的成员函数 empty&#xff1a;检测队列是否为空size&#xff1a;返回队列中有…

7-14 字节序(Endianness)---PTA实验C++

一、题目描述 “内存寻址的最小单位是字节”——明白。 “每个字节有唯一的编号&#xff0c;称为地址”——明白。 “C中int通常为四个字节”——了解。 “int x 1;最低字节是1还是0&#xff1f;——纳尼&#xff1f; 事实上&#xff0c;这里有点小小分歧&#xff1a; 多字…

C++对C的增强

1、作用域运算符 ::解决归属问题&#xff08;谁是谁的谁&#xff09; 可以优先使用全局变量 2、命名空间 使用关键字namespace&#xff0c;控制标名称的作用域。 命名空间的本质&#xff1a;对符号常量、变量、函数、结构、枚举、类和对象等等进行封装 1、创建一个命名空间…

学习小记录——python函数的定义和调用

今日小好运&#xff0c;未来有好运。&#x1f381;&#x1f496;&#x1fad4; 分享个人学习的小小心意&#xff0c;一起来看看吧 函数的定义 函数通常来说就是带名字的代码块&#xff0c;用于完成具体的工作&#xff0c;需要使用的时候调用即可&#xff0c;这不仅提高代码的…

我的创作纪念日-砥砺前行

机缘 大家好&#xff0c;我是诊断协议那些事儿&#xff0c;又和大家见面了&#xff0c;记录一下创作日记&#xff0c;转眼间已经在CSDN平台创作三年了&#xff0c;最初仅仅是为了记录学习过程中的笔记&#xff0c;后来慢慢转为项目实践中的经验分享&#xff0c;当然更多的希望…

dm8 什么时候视图中统计的内存会超过OS

v$bufferpool和v$mem_pool视图记录着DMSERVER各组件的内存占用量。理论上跟OS看到的保持一致。但实际大多数场景下&#xff0c;OS中看到的数据远大于视图中的统计。这里面可能有内存泄漏的原因。不过也有的时候视图中的统计数据超过OS。下面就是这种情况&#xff1a; 上图中红线…

nas连接萤石云摄像机CTQ6X

需要准备的nassurveillance 请参考这个大佬的流程 https://www.bilibili.com/video/BV1ri4y1g7EN/ 踩坑&#xff1a; 一直到添加录像机验证一直没问题&#xff0c;但是验证一直不通过&#xff0c;后面下载了萤石云工作室的win桌面客户端&#xff0c;不知道是不是设置了预览还…

【Ubuntu】【Shell】执行sh脚本报错“xxx.sh:/bin/bash^M:解释器错误: 没有那个文件或目录“

背景 在自己Ubuntu环境执行sh脚本&#xff0c;报错"xxx.sh&#xff1a;/bin/bash^M&#xff1a;解释器错误: 没有那个文件或目录"&#xff0c;查了下是Ubuntu系统默认的shell是dash: 修改配置过下&#xff0c;变成bash 解决方案 在终端执行&#xff1a; sudo dp…

云队友:专业的远程工作和程序员接单平台,用户体验佳

编程赚钱的平台有不少&#xff0c;良莠不齐&#xff0c;今天给大家分享个专业的远程工作平台&#xff0c;以技术类工作为主&#xff08;包括编程&#xff09;&#xff1a; 云队友简介 外包大师是PMCAFF互联网产品社区于2016年推出的互联网产品技术外包服务平台。外包大师最新…

MyBatis 核心配置文件详细内容详解

1. MyBatis 核心配置文件详细内容详解 文章目录 1. MyBatis 核心配置文件详细内容详解2. 测试和学习的准备工作3. environment 标签4. transactionManager 标签5. dataSource 标签6. properties 标签7. mapper 标签8. 总结&#xff1a;9. 最后&#xff1a; 关于 MyBatis 这个核…

攻防世界---misc---2017_Dating_in_Singapore

1、题目描述 2、下载附件是一个pdf&#xff0c;里面是一个日历 3、题目描述是一些数字&#xff0c;直觉猜测是和日历的日期有关&#xff0c;仔细看题目的描述&#xff0c;会发现有个-连接&#xff0c;拆开之后发现一共有12组数据&#xff0c;再连联系到十二个月份&#xff0c;再…

音视频开发—FFmpeg播放YUV文件,YUV转换为JPEG操作

文章目录 1.使用命令行播放YUV数据1.1命令解析1.2参数说明 2.使用C语言实现将YUV数据转为JPEG图片格式2.1需求分析2.2读取YUV源文件2.3将YUV数据封装为AVFrame2.4将NV12 转换为YUV420平面格式2.5初始化MJPEG编码器2.6将YUV420P编码为JPEG2.7将编码数据写入图片文件2.8完整代码 …

从零开始实现自己的串口调试助手(4) -实现自动发送 / 时间显示

实现自动发送:checkBox 添加bool槽函数 bool 值&#xff0c;当√的时候为true 取消√ 位false 实现带bool 类型的槽函数: void Widget::on_checkBox_SendInTime_clicked(bool checked) {qDebug()<<"checkStatus:"<<checked;if(checked){ // 被勾选了//…

Python语言进阶学习

目录 一、类、对象和成员方法 二、构造方法 三、面向对象 &#xff08;1&#xff09;封装 &#xff08;2&#xff09;继承 单继承 多继承 复写 super&#xff1a;调用父类同名成员 &#xff08;3&#xff09;多态 &#xff08;4&#xff09;抽象类 五、Python操作…

Leecode---技巧---只出现一次的数字 / 多数元素

题解&#xff1a; 利用异或运算 a⊕a 0 的性质&#xff0c;可用来消除所有出现了两次的元素&#xff0c;最后剩余的即为所得。 class Solution { public:int singleNumber(vector<int>& nums){// 初始化为0int ans 0;for(int x: nums){// 异或操作ans ^ x;}retur…

Java循环结构while

1.while 是最基本的循环&#xff0c;它的结构为 while&#xff08;布尔表达式&#xff09;{ //循环内容 } 2.只要布尔表达式为true&#xff0c;循环就会一直执行下去 3.我们大多数情况是会让循环停止下来的&#xff0c;我们需要一个让表达式时效的方式来结束…

05C零碎语法

C零碎语法 目录 文章目录 C零碎语法1.函数指针2.回调函数3.数据拷贝3.1静态内存分配![请添加图片描述](https://img-blog.csdnimg.cn/direct/54d44e32bb7944f0866d4ca1e2667ce8.png)### 4.1动态内存分配 字符串6.sizeof()和strlen()的区别7.strcpy()/strncpy()函数7.1**strcp…