暂无链接

B君的第四题

【问题描述】

已有的事后必再有,已行的事后必再行。

大家还记得Luogo P3959 [NOIP2017]宝藏 吗?

B君看到很多人用很多弱智的方法水过这个题,感到非常气愤。

这个题目就是把原题改成了一个计数题。

考虑到有些同学没有看过这个题目,我们简述这个题目如下。

输入一个图,我们定义一个有根生成树的权值是

∑e={x,y}we×max(dx,dy)∑e={x,y}we×max(dx,dy)

\sum_{e=\{x,y\}}w_e\times max(d_x,d_y)

用文字表述就是,枚举每条边,边权乘以两端较深的点的深度。

点的深度是从根节点,走到该点经过的边数。(而不是边权和,和原题定义一样。)

根节点深度为000,与根节点相邻的点深度为1" role="presentation" style="position: relative;">111,以此类推。

对于一棵树,他的有根生成树的个数是nnn乘以无根生成树个数,即对于每个无根生成树确定一个根。

输出所有有根生成树的权值之和,对1000000007" role="presentation" style="position: relative;">100000000710000000071000000007取模的结果。

【输入格式】

第一行两个整数n,mn,mn, m表示点数和边数。

接下来mmm行,每行三个整数x,y,w" role="presentation" style="position: relative;">x,y,wx,y,wx, y, w表示一条边的两个端点和边权。

【输出格式】

输出所有有根生成树的权值之和,对100000000710000000071000000007取模的结果。

【输入样例】

4 5
1 2 1
1 3 3
1 4 1
2 3 4
3 4 1

【输出样例】

303

题解

先把出题人的话放在前面:

%%%%%%\%\%\%

看过这篇博客的朋友应该知道,我就是那个用弱智方法水过的人。。。

虽然很绝望,但是我好像会606060分啊,开个long longlonglonglong\ long,唉,稳了稳了。

结果一条链的情况爆long longlonglonglong\ long,讲道理无根生成树个数最多11191119111^{9}不会爆啊,好不容易可以多拿一点部分分又滚粗了。。。

正解大概是个装压dpdpdp计数,我们用sou[d][i][j]sou[d][i][j]sou[d][i][j]表示到根节点距离为ddd,当前生成树集合中非叶子节点集合为i" role="presentation" style="position: relative;">iii,叶子结点为jjj的生成方案数,ans[d][i][j]" role="presentation" style="position: relative;">ans[d][i][j]ans[d][i][j]ans[d][i][j]表示对应的所有生成树方案权值之和。

每次枚举下一次扩张的集合kkk,由[d][i][j]" role="presentation" style="position: relative;">[d][i][j][d][i][j][d][i][j]转移到[d+1][i|j][k][d+1][i|j][k][d+1][i|j][k],注意i∩j∩k=∅i∩j∩k=∅i\cap j\cap k=\emptyset,所以总复杂度为O(n4n)O(n4n)O(n4^n)。

需要预处理way[i][j]way[i][j]way[i][j]表示从iii集合扩张到j" role="presentation" style="position: relative;">jjj集合的方案数,以及add[i][j]add[i][j]add[i][j]表示扩张增加的权值。

计算way[i][j]way[i][j]way[i][j]只需要将iii与j" role="presentation" style="position: relative;">jjj看做二分图,把i,ji,ji,j之间的边在jjj部分的度数乘起来即可;计算add[i][j]" role="presentation" style="position: relative;">add[i][j]add[i][j]add[i][j]则是将jjj集合中每个点连到i" role="presentation" style="position: relative;">iii的边的权值和乘以这些边的所在的扩展方案数。

还有另一个做法老子不会留给大家思考:

我还是太菜了。

代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int M=(1<<10)+5,N=11,mod=1e9+7;
int n,m,mx,now,x[M<<1],y[M<<1],w[M<<1],i,j,k,d;
ll way[M][M],add[M][M],dw[M],da[M],sou[N][M][M],ans[N][M][M];
void in()
{scanf("%d%d",&n,&m);for(i=1;i<=m;++i){scanf("%d%d%d",&x[i],&y[i],&w[i]);--x[i],--y[i],x[i+m]=y[i],y[i+m]=x[i],w[i+m]=w[i];}
}
void ac()
{m<<=1;mx=1<<n;for(i=0;i<mx;++i){for(j=0;j<mx;++j){if(i&j)continue;memset(dw,0,sizeof(dw));memset(da,0,sizeof(da));for(k=1;k<=m;++k)if((i>>x[k]&1)&&(j>>y[k]&1))++dw[y[k]],da[y[k]]+=w[k];way[i][j]=1;add[i][j]=0;for(k=0;k<n;++k)if(j>>k&1)way[i][j]*=dw[k];if(!way[i][j])continue;for(k=0;k<n;++k)if(j>>k&1)add[i][j]=(add[i][j]+way[i][j]/dw[k]*da[k]%mod)%mod;}}for(i=0;i<n;++i)sou[0][0][1<<i]=1;for(d=0;d<n;++d)for(i=0;i<mx;++i)for(j=0;j<mx;++j){if((i&j)||0==sou[d][i][j])continue;now=(1<<n)-1-i-j;for(k=now;;k=(k-1)&now){sou[d+1][i|j][k]=(sou[d+1][i|j][k]+sou[d][i][j]*way[j][k]%mod)%mod;ans[d+1][i|j][k]=(ans[d+1][i|j][k]+ans[d][i][j]*way[j][k]+sou[d][i][j]*add[j][k]*(d+1)%mod)%mod;if(!k)break;}}printf("%lld",ans[n][mx-1][0]);
}
int main(){in();ac();}

[2018.07.14 T1] B君的第四题相关推荐

  1. 使用Vue.js初次真正项目开发-2018/07/14

    一.组件化 使用Vue.js进行开发,按照MVVM模式,围绕数据为核心,进行开发. 开发过程根据业务和功能组件化,组件化一方面让我们开发思路更加清晰,另一方面对于数据的处理和控制变得更加简单,毕竟一个 ...

  2. 2018.07.19 仿优酷网页小项目

    时间:2018.07.19 大一下学期暑假 地点:成都-实习 项目类型:HTML+CSS仿优酷网页 制作时间:两天 网页源码: <!doctype html> <html> & ...

  3. 【跃迁之路】【530天】刻意练习系列289(2018.07.20)

    @(跃迁之路)专栏 叨叨两句 技术的精进不能只是简单的刷题,而应该是不断的"刻意"练习 该系列改版后正式纳入[跃迁之路]专栏,持续更新 一.语言练习 SQL [跃迁之路]SQL语句 ...

  4. 2018.8.14笔记

    2018.8.14笔记 setsiblingindex(idx)设置兄弟结点先后顺序时,若idx处已有结点X,则结点X及其后的所有节点后移 gc alloc,就是申请堆内存,堆内存申请无处不在,不可能 ...

  5. 2018.07.30 巴别时代

    * 项目部署更新 用符号链接 project => project1, project2 ln -s project2 project * composer自动加载机制 namespace =& ...

  6. 计算机系职教周方案,琼软院软件〔2018〕14 号:关于印发《软件工程系2018年“职业教育 活动周”活动方案》的通知...

    琼软院软件[2018]14号 海南软件职业技术学院软件工程系 关于印发<软件工程系2018年"职业教育 活动周"活动方案>的通知 各位老师: <软件工程系2018 ...

  7. 2018.11.14成立我的博客

    2018.11.14成立我的博客 转载于:https://www.cnblogs.com/zengxx/p/9957509.html

  8. 学习手记(2018/7/14~2018/7/18)——快乐纪中

    2018/7/14:普通的纪中一天 儿子兄弟表示法 将一颗多叉树转换为二叉树的方法,左子节点连原树的第一个儿子,右子节点连原树的右边的兄弟 适用范围:树形dp 数位dp常见方法 状态压缩 分类讨论 记 ...

  9. 训练日志 2018.11.14

    这周的计划是 Ford.SPFA 看完了,2-SAT 看了一半,并查集没按计划完成,但把最小生成树看了,还算可以... 下周 2-SAT.次短路径.并查集... 今晚打比赛..菜的一批...做了 4. ...

  10. 暑期训练日志----2018.8.14

    训练第16天. 上午因为百度之星的比赛,还是没法做题,看了看教练发的 DP 专栏,忽然觉得以前学的 DP 还是不够深,就跑去把之前整理的 DP 和背包九讲重新看了一遍 下午把昨天个人赛没写的两个题搞明 ...

最新文章

  1. 云计算平台管理的三大利器Nagios、Ganglia和Splunk
  2. pb9数据窗口中显示行数据与当前行区别_Hive的窗口函数
  3. java工程转maven工程_将java工程转换为Maven工程
  4. [css] 用css3实现文字发光的效果
  5. 平均年薪30万的深度学习算法工程师,正面临100万的人才缺口
  6. Python以字符形式打印双色图片中的文字
  7. php上传文件插件怎么用,使用jquery-fileupload上传插件
  8. 学习笔记-Speed-Win
  9. Rootkit检测技术发展现状
  10. 飞思卡尔16位单片机(一)——飞思卡尔单片机简介
  11. 计算机显卡驱动全部卸载,Win7彻底卸载NVIDIA显卡驱动程序的办法
  12. 刘强东学习亚马逊:控制供应链 技术是最大障碍
  13. 从电商到软件市场,阿里双十一战火蔓延
  14. C/C++读取txt
  15. java面试---数据库之数据库优化及mycat分库分表
  16. 数字平原CG场景搭建制作流程解析
  17. rapidminer员工离职分析_RapidMiner 9从根本上简化了分析团队的数据准备工作
  18. nodejs学习-fs模块
  19. 计算机网络第一章章节总结,第计算机网络技术第一章.ppt
  20. 京东618叠蛋糕脚本,亲测好用

热门文章

  1. 实数系的完备性的含义
  2. 下载oracle环境变量失败,oracle instantClient 安装配置及Error: DPI-1047: Cannot locate a 64-bit Oracle Client...
  3. 酷比魔方iwork12 linux,双系统二合一 酷比魔方iwork 12评测
  4. excel查找空值快捷键_有了这7个Excel中常用的小技巧,再也不用担心自己要加班了!...
  5. Python文件运行时报TabError: inconsistent use of tabs and spaces in indentation
  6. opencv5-objdetect之级联分类器
  7. Unity 单元测试(NUnit,UnityTestTools)
  8. HP MSA2312 ERROR
  9. 在GlassFish中应用Hibernate
  10. [转]VS 2005快捷键