[ARC057D]全域木
题意:求有多少个边权为$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]全域木的更多相关文章
- 山东省滕州市木石镇化石沟村QQ群116528924
山东省滕州市木石镇化石沟村QQ群116528924
- Chrome Apps將是Google送給微軟的特洛伊木馬?
今天,Google 發表了 Chrome Apps,不同於之前 web app,此舉是要把 Chrome 瀏覽器升級為真正的 app 平台,將 Chrome OS 發展成一個成熟的作業系統,可以視為 ...
- 甲骨文白桃花心木P6 EPPM 8.2项目点提供样本
甲骨文白桃花心木样例代码 除非明确确定,这里的示例代码不是认证或Oracle支持;它只是用于教育或测试的目的. 你必须接受 许可协议下载此示例代码. 接受 许可协议 | 下降 许可协议 的名字 ...
- Xamarin.Android之山有木兮之木有枝,心悦君兮君不知。
Xamarin.Android之山有木兮之木有枝,心悦君兮君不知. 第一步,写项目中的第一个界面. <?xml version="1.0" encoding =" ...
- E3: PS4/PC 莎木3 众筹200万美元 9小时内达成
这次E3任天堂没有新掌机(传说中的XDS呢.呵呵)和口袋的消息, 被喷得很严重, 索尼的FF7重制版和莎木3是亮点. 而莎木3的众筹速度据说创了记录, 玩家的情怀大胜. 笔者看到国内也有赞助几十刀的玩 ...
- 动态规划(斜率优化):[CEOI2004]锯木厂选址
锯木场选址(CEOI2004) 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运.山脚下有 ...
- 【CEOI2004】锯木厂选址
[题目描述] 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂.木材只能按照一个方向运输:朝山下运.山脚下有一个锯木厂.另外两个 ...
- Unity3d 游戏汉化之IL注入文本替换--木石世纪
近期下了个游戏叫木石世纪(Timber and Stone),沙盒游戏类,看着还不错. 搜了下游戏资料,有人求汉化可是因为是小众游戏,没人出汉化.看了眼是Unity3d的,既然是.Net的,仅仅要资源 ...
- 数据结构 - AVL木
在计算机科学,AVL木是一个平衡树最早发明. 于AVL树节点,而不管是什么的两个子树之一的高度之间最大的区别,因此,它也被称为平衡树高.查找.O(log n). 插入和移除可能需要一个或更多次通过旋转 ...
随机推荐
- OpenCVSSDpython目标探测对象检测
1.请参考大牛博客链接 https://www.aiuai.cn/aifarm822.html
- 为什么Javascript有设计缺陷
1. 设计阶段过于仓促 Javascript的设计,其实只用了十天.而且,设计师是为了向公司交差,本人并不愿意这样设计(参见<Javascript诞生记>). 另一方面,这种语言的设计初衷 ...
- 阅读关于DuReader:百度大规模的中文机器阅读理解数据集
很久之前就得到了百度机器阅读理解关于数据集的这篇文章,今天才进行总结!.... 论文地址:https://arxiv.org/abs/1711.05073 自然语言处理是人工智能皇冠上的明珠,而机器阅 ...
- 解决不走onActivityResult方法
最近在开发公司项目,在使用startActivityForResult关联俩个Activity中,发现A跳转到B,B设置setResult之后,A没有执行onActivityResult,查找一下,发 ...
- xrange和range的区别
>>> print type(range(5)) <type 'list'> >>> print type(xrange(5)) <type 'x ...
- 64_g6
gsettings-desktop-schemas-devel-3.24.0-1.fc26.x..> 22-Mar-2017 20:46 19386 gsf-sharp-0.8.1-27.fc2 ...
- python之requests库使用问题汇总
一.请求参数类型 1.get requests.get(url, data, cookies=cookies) url:字符串: data:字典类型,可以为空: cookies:字典类型,可以为空: ...
- android intent 传数据
1. 基本数据类型 Intent intent = new Intent(); intent.setClass(activity1.this, activity2.class); //描述起点和目标 ...
- 51Nod 1022 石子归并 V2(区间DP+四边形优化)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022 题目大意: N堆石子摆成一个环.现要将石子有次序地合并成 ...
- POJ-1830
开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6294 Accepted: 2393 Description ...