首页 > 其他分享 >G. Counting Graphs

G. Counting Graphs

时间:2023-10-04 11:11:38浏览次数:32  
标签:return int siz LL Graphs res Counting

G. Counting Graphs

题意:添加几条线段,使得图仍保持原先的最小生成树

通过画图我们发现,要添加u->v的线段,线段必须大于u->v的路径内的最大值,不然会破坏原先的最小生成树。
那么该怎么维护路径内的最大值呢?
方法:
1.我们对边的大小进行排序,这样当前边一定大于等于之前的边,只要对当前边进行操作就行。
但是这样可能会造成多个集合,那我们可以利用并查集
2.对于两个集合,它们最多能加的边只有siz_l*siz_r-1(因为不能有重边,所以要减一),那么它们的组合是怎样的?
可以这样想,每条边的选着可以是[S,w),0(不加也是一种选着),所以对于每条边都可以有S-w+1中可能,一共有siz_l * siz_r-1条边,根据乘法原理,它们总的组合是(S-w+1)^(siz_l * siz_r-1)。

3.两集合合并后记得更改其大小

4.那么总的组合就是这些组合的相乘

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 2e5 + 10,mod= 998244353;
int f[N],siz[N];
int find(int x) {
	return f[x] == x ? x : f[x] = find(f[x]);
}
void solve() {
	LL n, S;
	cin >> n >> S;
	vector<array<LL, 3>> v(n-1);
	for (int i = 0; i < n-1; i++) {
		cin >> v[i][0] >> v[i][1] >> v[i][2];
	}
	//最小生成树
	sort(v.begin(), v.end(), [&](array<LL, 3> &a, array<LL, 3> &b) {
		return a[2] < b[2];
		}
	);

	auto _pow = [](LL a, LL b) {//快速幂
		LL res = 1;
		while (b) {
			if (b & 1) res = res * a % mod;
			a = a * a % mod;
			b >>= 1;
		}
		return res;
		};

	LL ans = 1;

	for (int i = 0; i <= n; i++) f[i] = i,siz[i]=1;//初始化

	for (int i = 0; i < n - 1; i++) {
		int x = find(v[i][0]);
		int y = find(v[i][1]);
		if (x != y) {
			ans = (ans*_pow(S - v[i][2]+1, 1LL*siz[x] * siz[y] - 1))%mod;
			siz[y] += siz[x];//更新集合内的数量
			f[x] = y;//合并到y集合
		}
	}
	cout<< ans;
	cout << "\n";
}
int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
	cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}

标签:return,int,siz,LL,Graphs,res,Counting
From: https://www.cnblogs.com/bu-fan/p/17742033.html

相关文章

  • AtCoder Beginner Contest 288 Ex A Nameless Counting Problem
    洛谷传送门AtCoder传送门考虑到规定单调不降比较难搞。先设\(g_t\)为长度为\(t\)的满足条件的序列个数(可重且有顺序)。求这个可以设个dp,\(f_{d,i}\)表示考虑到从高到低第\(d\)位,当前\(t\)个数中有\(i\)个仍然顶上界,并且之前的位都满足异或分别等于\(X\)的限制。......
  • 挑战程序设计竞赛 2.1章习题 POJ 2386 Lake Counting
    https://vjudge.net/problem/POJ-2386由于最近的降雨,水在农夫约翰的田地上聚集,在这片田地中,每个方块都被表示为一个NxM(1≤N≤100;1≤M≤100)的矩形。每个方块可以是水('W')或干地('.')。农夫约翰想弄清楚他的田地上形成了多少个池塘。池塘是由含有水的相连方块组成的集合,......
  • counting题解
    \(N,M\le1e7\)接着反射容斥,考虑这道题怎么做如果去枚举不动步数,加上反射容斥,直接T飞了把-1/0/1操作转换一下,就成了0/1/2如果没有限制(不能<0或>m),n步方案就是\((1+x+x^2)^n\)设\(H=1+x+x^2\quadF=H^n\)那么对两边求导:\[nH^{n-1}H'=F'\]\[F'H=nFH'\]我们知道\[H=1+x+x^2......
  • CF1857G Counting Graphs
    题目链接考虑每条非树边的取值,显然不能小于等于该边与树边形成的环中的最大值(当然这条非树边也可以不存在),所以每条非树边的取值范围就是\(S-max(w)+1\)(\(+1\)的原因是该边可能不存在)。暴力枚举肯定会超时,考虑优化。发现\(kruskal\)算法获得最小生成树的过程中,按从小到......
  • 一个树状数组求逆序对的进阶 [USACO17JAN] Promotion Counting P
    题面就这样,就是在树上求一个逆序对但是我笨笨地求了对于每一个下属有几个上司能力比他低还一遍就写对了,结果发现看错题目了难得一遍过,但是没有完全过 ......
  • [ABC309Ex] Simple Path Counting Problem
    ProblemStatementWehaveagridwith$N$rowsand$M$columns.Wedenoteby$(i,j)$thecellinthe$i$-throwfromthetopand$j$-thcolumnfromtheleft.Youaregivenintegersequences$A=(A_1,A_2,\dots,A_K)$and$B=(B_1,B_2,\dots,B_L)$oflengths......
  • [VLDB 2012]Efficient Subgraph Matching on Billion Node Graphs
    [VLDB2012]EfficientSubgraphMatchingonBillionNodeGraphs重点了解实现star-join的具体过程。分解query和STwigs排序文中把star叫做STwigs,每一个STwigs查询为\(q=(r,L)\),其中r是跟节点标签,L是子节点标签合集。点的选择性:\(f(v)=deg(v)/freq(v.label)\)分解算法:每次......
  • [ABC319G] Counting Shortest Paths
    [ABC319G]CountingShortestPathsAtcoder:[ABC319G]CountingShortestPaths洛谷:[ABC319G]CountingShortestPathsProblem经典问题:求补图的最短路,边权均为\(1\),并顺带求出\(1\ton\)最短路的数量。\(n\le2\times10^5\)。Solution每次从队列中把最早遍历到的节点......
  • GCD Counting题解
    题意有一棵有\(n\)个节点的树,第\(i\)个节点有点权\(a_i\)。定义\(g(x,y)\)为\(x\)到\(y\)的树上路径所经过的点的点权\(\gcd\)。对于每一个正整数\(k\in[1,2\times10^5]\)求出满足以下条件的\(x,y\)的对数:\(1\lex\ley\len\)\(g(x,y)=k\)\(1\len......
  • [CF1518D] XOR Counting
    XORCounting由于a可以为非负整数并且不关心a的具体数值,所以m大了后填很多0即可。分类讨论。m=1时直接输出n即可。m>=3时,注意到xor运算与加运算同奇偶,所以a只能异或出来与n同奇偶的数。可以构造出\(a_1=x,a_2=\frac{n-x}{2},a_3=\frac{n-x}{2},a_4=0,a......