题意:求有多少个边权为$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. Network of Schools(POJ1326+有向图进行缩点)

    题目链接:http://poj.org/problem?id=1236 题目: 题意:对于n个学校,对于一个系统传给某个学校,那么他会传给他得支援学校.从第二开始,每行给你多个数字,表示第i个学校可以 ...

  2. apache log 按日期记录 格式 <GOOD>-- (转)

    在apache的配置文件中找到ErrorLog logs/error_logCustomLog logs/access_log common Linux系统配置方法: 将其改为ErrorLog “| ...

  3. 代码合并:Merge、Rebase 的选择

    图解 Git 命令 基本用法 上面的四条命令在工作目录.stage 缓存(也叫做索引)和 commit 历史之间复制文件. git add files 把工作目录中的文件加入 stage 缓存 git ...

  4. Python3 json、pickle序列化与反序列化

    注意:可以dumps多次,loads只能一次,一般我们只dumps一次,loads一次,多个版本就写入多个文件 一.json序列化与反序列化: 支持各种语言数据交互,但只能处理字典,列表,集合等简单的 ...

  5. 刷新SqlServer数据库中所有的视图

    ALTER PROCEDURE sp_refallview AS --刷新所有视图 DECLARE @ViewName VARCHAR(MAX); DECLARE @i INT; ; DECLARE ...

  6. CNN中已知input_size、kernel_size、padding、stide计算output公式的理解

    在进行卷积运算和池化的时候,对于输入图像大小为input_size,给定kernel_size.padding.stride,计算得出output_size为: output_size =1+ (in ...

  7. 排名函数row_number() over(order by)用法

    1. 定义 简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY [列名]DESC) 是先把[列名]降序排列,再为降序以 ...

  8. 用vue实现登录页面

    vue和mui一起完成登录页面(在hbuilder编辑器) <!DOCTYPE html> <html> <head> <meta charset=" ...

  9. sqlserver2008 死锁解决方法及性能优化方法

    sqlserver2008 死锁解决方法及性能优化方法 原文: http://blog.csdn.net/kuui_chiu/article/details/48621939 十步优化SQL Serv ...

  10. 根据节点解析xml

    config.xml文件如下: <?xml version="1.0" encoding="gb2312" ?> <root> < ...