专栏文章

SP1870 MKLABELS 题解

SP1870题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipaz2p3
此快照首次捕获于
2025/12/03 09:02
3 个月前
此快照最后确认于
2025/12/03 09:02
3 个月前
查看原文

题目大意

计算给定节点数 NN 的树的不同标记方式的数量。这里的“不同标记方式”指的是非同构的标记树的数量,即考虑树的自同构群的影响。

思路分析

这道题可以通过一种非常简单的方法来解决,通过凯莱公式来做。很多人可能连这是什么的不知道,那我们就先来了解一下凯莱公式。

凯莱公式简介

凯莱公式(Cayley`s formula)是组合数学和图论中的一个结论,它给出了告诉我们在 nn 个顶点中可以构造多少棵不同的标记树。它是这样一个等式: n个顶点的标记树数量=nn2\text{有} n \text{个顶点的标记树数量} = n^{n-2}
N={1,2,,n}N=\{1,2,\cdots,n\} 为顶点集合,并令 TnT_n 为有 nn 个顶点的标记树的数量。我们可以通过枚举法,在 nn 较小时验证此公式,如 T1=1,T2=1,T3=3,T4=16T_1=1,T_2=1,T_3=3,T_4=16
证明这里便不再详细讲述,如果有兴趣可以自己下去查。

相信当你知道了凯莱公式之后,这道题便可以轻松解决了,只需要将凯莱公式带入程序中满足就行了。

参考代码

CPP
#include<bits/stdc++.h>
#define int long long
#define Rint register int
#define fast_running ios::sync_with_stdio(false),std::cin.tie(0),std::cout.tie(0)
using namespace std;

signed main() {
	fast_running;
	int n, cnt = 0;
	while (cin >> n && n != 0) {
		++cnt;
		cout << "Case " << cnt << ", N = " << n << ", # of different labelings = " << (int)(pow(n, n - 2)) << '\n';
		//这里如果用 pow 函数需要强制类型转化,不然可能会用科学计数法输出
		/*也可以这样: 
		int out = pow(n, n - 2);
		cout << out << '\n';
		*/ 
		//当然也可以自己写一个 “pow” 
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...