题目链接:https://codeforces.com/contest/1139/problem/C

       题意是给了一棵树,n个点,m条边。让从中选k个点,使得从a1到a2,a2到a3,ak-1到ak的路径中至少经过一条黑色的边,问这样的集合有多少个

       思路就是求他们的组合数,所有的可能就是n^k,假如说像第一个样例那样只有黑色边存在,那么不可行的情况就是下面解释的那样,所以答案就是n^k - n,如果存在红色边的情况,比如说第二个样例,因为2到3连的是红边,那么对于只有这两个点的集合来说,他们的所有情况为2^k,所以答案就是n^k - 2^k - 1(这个1是1 1 1的情况)。那么我们反过来看题中的那个图,连的有红色边的点有6个,那么我们如果让n^k - 6^k肯定是不对的,因为有些点是可以经过黑边到达另一个点的,比如从1到7,那么这样的集合是不应该减的,所以我们要减的应该是只被红边连接的点,而且必须要连通,也就是减去4^k再减去2^k,然后再减去那些剩下的一个集合中只有1个数的情况。

       所以这道题的正解应该是我们将那些连了红边的点建边,然后对于每一个点跑一边dfs,目的是为了找出与当前这个点相连的点有多少个(就是找用红边相连的联通块),然后减去这个cnt^k就好了。感觉讲的不太好理解,自己看着题上的图想一下就好了。


AC代码:

#include <bits/stdc++.h>
#define ll long long
#define maxn 200005
const ll mod = 1e9 + 7;
using namespace std;
struct Node{int to,next,w;
}Edge[maxn];
int head[maxn],num;
ll n,k,cnt;
bool vis[maxn];
map<int,int> ma1,ma2;ll ppow(ll a, ll b){ll sum = 1;a %= mod;while(b > 0){if(b % 2 == 1) sum = (sum * a) % mod;b /= 2;a = (a * a) % mod;}return sum % mod;
}void init(){for(int i=0;i<=n;i++) head[i] = -1;num = 0;
}void add(int u,int v,int w){Edge[num].to = v;Edge[num].w = w;Edge[num].next = head[u];head[u] = num ++;
}void dfs(int x){cnt ++;for(int i=head[x];i!=-1;i=Edge[i].next){int to = Edge[i].to;if(!vis[to]){vis[to] = true;dfs(to);}}
}int main()
{scanf("%lld%lld",&n,&k);init();for(int i=1;i<n;i++){int u, v, w;scanf("%d%d%d",&u,&v,&w);if(w == 0){add(u, v, w);add(v, u, w);}}ll cnt2 = 0;ll ans = ppow(n, k);memset(vis,false,sizeof(vis));for(int i=1;i<=n;i++){if(vis[i] == false){vis[i] = true;cnt = 0;dfs(i);ans = (ans - ppow(cnt, k) + mod) % mod;}}printf("%lld\n", ans);return 0;
}

Codeforces Round #548 (Div. 2) C. Edgy Trees(思维+dfs)相关推荐

  1. Codeforces Round #548 (Div. 2) C. Edgy Trees(dfs || 并查集)

    题目链接:https://codeforces.com/contest/1139/problem/C 题意:给了一棵树,n个点,m条边.让从中选k个点,使得从a1到a2,a2到a3,ak-1到ak的路 ...

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

    Codeforces Round #548 (Div. 2)C Edgy Trees 题目传送门 You are given a tree (a connected undirected graph ...

  3. 【Codeforces Round #548(Div. 2)】Edgy Trees(数学+bfs求连通块)

    题目链接 C. Edgy Trees time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  4. Codeforces Round #548 (Div. 2)C. Edgy Trees 并查集

    codeforces 1139C 题目链接:http://codeforces.com/contest/1139/problem/C 题意: 给你一个n个结点n-1条边的无向连通图,由红边和黑边组成. ...

  5. Codeforces Round #548 (Div. 2) C. Edgy Trees(并查集+快速幂)

    思路用并查集统计一个连通块的节点个数,最后用总的减去他,设x是连通块的节点个数,o个联通块 #include<bits/stdc++.h> #define fi first #define ...

  6. Codeforces Round #731 (Div. 3) G. How Many Paths? dfs + 拓扑 + 思维

    传送门 题意: 给你一张nnn个点mmm条边的图,让你对每个点确定一个编号,规则如下: (1)(1)(1) 对于不能到的点编号为000. (2)(2)(2) 对于只有一条路径能到这个点的点编号为111 ...

  7. Codeforces Round #587 (Div. 3) C. White Sheet 思维

    传送门 文章目录 题意: 思路: 题意: 给你一个白色的矩形和俩个黑色的矩形,问白色被黑色覆盖后还能不能看到. 思路: 经典被简单题卡. 一开始写了个自我感觉很对的做法,结果wa41wa41wa41, ...

  8. Codeforces Round #636 (Div. 3) E. Weights Distributing 思维 + bfs

    传送门 文章目录 题意: 思路: 题意: n≤2e5,m≤2e5n\le2e5,m\le2e5n≤2e5,m≤2e5 思路: 怎么感觉每场div3div3div3都有一个巧妙的图论题. 首先如果只有两 ...

  9. Codeforces Round #617 (Div. 3) F. Berland Beauty 思维

    传送门 文章目录 题意: 思路: 题意: 给定一棵树,再给定若干两点最短路之间边权的最小值,让你给树的边权赋值,使得满足给定的条件,如果不存在输出−1-1−1. 思路: 观察一个性质,加入经过这条边的 ...

最新文章

  1. (转)IntelliJ Idea 的相关使用
  2. SpringBoot------全局异常捕获和自定义异常
  3. 用python玩转数据第四周答案_2020大学mooc用Python玩转数据课后答案
  4. 64.JPA命名策略【从零开始学Spring Boot】
  5. 避坑_node-sass安装问题及解决办法
  6. markdown不允许还有人不会
  7. 企业要想迅速壮大,不仅需要大量的人才
  8. Tomcat 部署多个项目出现错误
  9. 【牛客练习赛58-C】矩阵消除游戏(dfs+状态标记)
  10. mapinfo在线地图插件_利用开源软件下载地图和影像瓦片数据(修订版)
  11. vue 或 js 实现 excel表格的导出(笔记)
  12. linux更新war包操作步骤,关于Linux系统下基于Tomcat部署和升级war包的详细过程
  13. 明明是那么好的人,却又是那么伤人的人
  14. iar定义arm版本_Keil MDK 和 IAR 两款ARM开发工具区别比较
  15. kafka消息堆积且CPU过高代码优化
  16. 吉林大学珠海学院论坛 http://j.bnubbs.cn
  17. 应用商店打开服务器错误,应用商店出错的修复方法
  18. Thinking in uml 大象 系统用例
  19. 反跟单讲解1:重新认识期货反向跟单
  20. 清理Windows系统的C盘空间

热门文章

  1. 几何画板如何添加按钮
  2. 2021-12-22 AndroidR 电池信息 简单分析记录
  3. A002-185-1203
  4. Conda环境无法激活
  5. threejs中设置物体的贴图+场景的6面贴图 +创建空间
  6. mysql 建表最佳实践
  7. mysql数据库占用太多的CPU_mysql数据库CPU使用率过高解决方案
  8. 鱼塘捕捞周期效益分析
  9. GITLAB email不发送腾讯企业邮箱解决方案
  10. 解决error: inlining failed in call to always_inline ‘int _mm_popcnt_u32(unsigned int)’