带标号的连通图计数
题目描述:
带标号的连通图计数。统计有n ( n<=50)个顶点的连通图有多少个。图的顶点有编号。例如n=3时有4个不同的图, n=4时有38个图;n=5,6时分别有728,26704个图
分析:
设f(n)为所求答案,g(n)为由n个顶点的非连通图,则f(n)+g(n)=h(n)=2n(n-1)/2 。
g(n)可以这样计算:先考虑1所在连通分量包含哪些顶点。假设1所在连通分量有k(k<n)个顶点,就有C(n-1,k-1)中取法,剩下的n-k的顶点随便共有h(n-k)中方法,根据加法原理
g ( n ) = ∑ k = 1 n − 1 C ( n − 1 , k − 1 ) ∗ f ( k ) ∗ h ( n − k ) g(n)= \sum_{k=1}^{n-1}C(n-1,k-1)*f(k)*h(n-k) g(n)=k=1∑n−1C(n−1,k−1)∗f(k)∗h(n−k)
f ( n ) = h ( n ) − g ( n ) f(n)=h(n)-g(n) f(n)=h(n)−g(n)
初始状态
f(0)=1;算是一个空图
f(1)=1,h(1)=1,g(1)=0
因为数据较大,所以涉及到高精度乘法减法加法。
#include<cstdio>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstring>
#include<string>
#