题意:求有多少个边权为$1\cdots\frac{n(n-1)}2$的完全图的最小生成树的边权为$a_{1\cdots n-1}$

啊啊啊我tm真的是什么都不会啊

考虑kruskal的过程:每次选取跨连通块的最小边,考虑设计相应状态的DP

设$f_{V,c,l}$($V$是一个可重集)表示(连通块大小组成可重集为$V$,当前考虑到$c$这条边,有$l$条边满足加入后不改变连通性)的方案数,我们要求的是$f_{\{1,\cdots,1\},1,0}$

从小到大考虑$c$,边界是$c\gt\frac{n(n-1)}2$时$f_{?,c,?}=1$

如果$c$不在$a$中,那么它不能跨块,这条边必须从$l$条边里选,于是$f_{V,c,l}=l\cdot f_{V,c+1,l-1}$

如果$c$在$a$中,那么它要跨块,考虑合并$V$中的两个连通块,枚举$x,y\in V$并将它们合并,设$V'=V-\{x\}-\{y\}+\{x+y\}$,用$xy\cdot f_{V',c+1,l+xy-1}$来转移

实现可以用map<vector,int>并记忆化(话说我今天才知道vector可以比较...)

#include<stdio.h>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef vector<int> vint;
const int mod=1000000007;
int mul(int a,int b){return(ll)a*b%mod;}
int n;
map<vint,int>f[450][450];
bool us[450];
int dfs(vint v,int c,int l){
	if(c>n*(n-1)/2)return 1;
	if(f[c][l].count(v))return f[c][l][v];
	int res=0;
	if(us[c]){
		vint v2;
		int i,j,k;
		for(i=1;i<(int)v.size();i++){
			for(j=0;j<i;j++){
				v2.clear();
				for(k=0;k<(int)v.size();k++){
					if(k!=i&&k!=j)v2.push_back(v[k]);
				}
				v2.push_back(v[i]+v[j]);
				sort(v2.begin(),v2.end());
				(res+=mul(v[i]*v[j],dfs(v2,c+1,l+v[i]*v[j]-1)))%=mod;
			}
		}
	}else if(l)
		res=mul(l,dfs(v,c+1,l-1));
	return f[c][l][v]=res;
}
int main(){
	int i,x;
	scanf("%d",&n);
	for(i=1;i<n;i++){
		scanf("%d",&x);
		us[x]=1;
	}
	printf("%d",dfs(vint(n,1),1,0));
}

[ARC057D]全域木的更多相关文章

  1. 山东省滕州市木石镇化石沟村QQ群116528924

    山东省滕州市木石镇化石沟村QQ群116528924

  2. Chrome Apps將是Google送給微軟的特洛伊木馬?

    今天,Google 發表了 Chrome Apps,不同於之前 web app,此舉是要把 Chrome 瀏覽器升級為真正的 app 平台,將 Chrome OS 發展成一個成熟的作業系統,可以視為 ...

  3. 甲骨文白桃花心木P6 EPPM 8.2项目点提供样本

    甲骨文白桃花心木样例代码 除非明确确定,这里的示例代码不是认证或Oracle支持;它只是用于教育或测试的目的. 你必须接受 许可协议下载此示例代码.  接受 许可协议 |  下降 许可协议   的名字 ...

  4. Xamarin.Android之山有木兮之木有枝,心悦君兮君不知。

    Xamarin.Android之山有木兮之木有枝,心悦君兮君不知. 第一步,写项目中的第一个界面. <?xml version="1.0" encoding ="  ...

  5. E3: PS4/PC 莎木3 众筹200万美元 9小时内达成

    这次E3任天堂没有新掌机(传说中的XDS呢.呵呵)和口袋的消息, 被喷得很严重, 索尼的FF7重制版和莎木3是亮点. 而莎木3的众筹速度据说创了记录, 玩家的情怀大胜. 笔者看到国内也有赞助几十刀的玩 ...

  6. 动态规划(斜率优化):[CEOI2004]锯木厂选址

    锯木场选址(CEOI2004) 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运.山脚下有 ...

  7. 【CEOI2004】锯木厂选址

    [题目描述] 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂.木材只能按照一个方向运输:朝山下运.山脚下有一个锯木厂.另外两个 ...

  8. Unity3d 游戏汉化之IL注入文本替换--木石世纪

    近期下了个游戏叫木石世纪(Timber and Stone),沙盒游戏类,看着还不错. 搜了下游戏资料,有人求汉化可是因为是小众游戏,没人出汉化.看了眼是Unity3d的,既然是.Net的,仅仅要资源 ...

  9. 数据结构 - AVL木

    在计算机科学,AVL木是一个平衡树最早发明. 于AVL树节点,而不管是什么的两个子树之一的高度之间最大的区别,因此,它也被称为平衡树高.查找.O(log n). 插入和移除可能需要一个或更多次通过旋转 ...

随机推荐

  1. floyd骚操作——传递闭包

    传递闭包的含义指通过传递性推导出尽量多的元素之间的关系,而传递闭包一般都是采用floyd算法. 下面用两道题来实现传递闭包: Problem 1(POJ3660): 题目链接:http://poj.o ...

  2. C# 文件类的操作---删除

    //删除文件夹 1这是最简单的方法 DirectoryInfo di = new DirectoryInfo(string Path); di.Delete(true); 注:path是你要删除的非空 ...

  3. docker 环境

    1.docker 升级 步骤: docker -v service docker stop yum -y update docker.io

  4. python进行机器学习(二)之特征选择

    毫无疑问,解决一个问题最重要的是恰当选取特征.甚至创造特征的能力,这叫做特征选取和特征工程.对于特征选取工作,我个人认为分为两个方面: 1)利用python中已有的算法进行特征选取. 2)人为分析各个 ...

  5. mysql 之修改初始密码

    转载自:https://www.cnblogs.com/ivictor/p/5142809.html 为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于er ...

  6. C++学习之路(五):复制构造函数与赋值运算符重载

    之前没有细想过两者的区别,今天对此进行简要记录,后续完善补充. 复制构造函数是在类对象被创建时调用的,但是赋值运算符是被已经存在的对象调用完成赋值操作. 复制构造函数只在对象实例化时才被调用,即在复制 ...

  7. 在linux内核中获得比jiffies精度更高的时间值【转】

    转自:http://blog.chinaunix.net/uid-20672257-id-2831219.html 内核一般通过jiffies值来获取当前时间.尽管该数值表示的是自上次系统启动到当前的 ...

  8. 64_m1

    MAKEDEV-3.24-18.fc26.x86_64.rpm 13-Feb-2017 22:33 101030 MUMPS-5.0.2-8.fc26.i686.rpm 14-Feb-2017 13: ...

  9. udpserver.pl 和 udpclient.pl

    udpserver.pl #!use/bin/perl -w use Socket; #导入Socket库 ,INADDR_ANY);#压入sockaddr_in模式,利用了全局当地压缩地点INADD ...

  10. OC 01 类和对象

    一.  定义OC的类和创建OC的对象 接下来就在OC中模拟现实生活中的情况,创建一辆车出来.首先要有一个车子类,然后再利用车子类创建车子对象 要描述OC中的类稍微麻烦一点,分2大步骤:类的声明.类的实 ...