http://162.105.81.212/JudgeOnline/problem?id=1737
题意: 一个无向图就是有v个顶点和e条边(E∈{V*V})构成的一个集合。如果一个无向图对于每个点对(u,v)都可以从u通过边到底v,那么这个图就是连通的,你的任务就是写一个程序来计算总共有多少个不同的包含n个顶点的连通的无向图;
分析:对于我老菜来说此题是很好很难的图论+数论。自己弄了很久,最后看了牛人的解题报告才弄明白,汗~废话少说贴下牛人的报告吧。
题目大致意思是给定n个点,求这n个点的连通图的个数。
用g(n)表示n个点总共可以表示成几个图,因为总共有n*(n-1)/2条边,而这n*(n-1)/2中每条边连或不连有两种可能,所以g(n)=2^(n*(n-1)/2)
所以连通图的个数=总的图的个数-不是连通图的个数;
那令f(n)表示n个点的连通图的个数;
而不连通的图的个数是顶点数小于n的连通图的个数乘以剩下的顶点总共的图的个数,即
;如图 :
所以
但是…
真的是Cin吗,看一个例子
1)
2)
1)和2)其实是同一种状态,但是按 算选出(1,2)是一种,选出(3,4)是一种,所以产生了重复。
那么该怎么修改呢,其实只要固定一个点,假设是1,再从n-1个点中选出i-1个点去跟1构成连通图即Ci-1n-1,那样就可以避免重复了;
综上:
因为n=11时数据就已经达到
35641657548953344了;
N=12的话就超过__int64的范围了。
所以此题必然要用到高精度了。
在计算f,Cin的时候把f,Cin算出来后保存下来,避免重复计算,否则有可能超时。
还有个要注意的就是:计算Cin时可以用公式Cin= Ci-1n+Ci-1n-1,这样就可以用高精度加法递推出来了。