Dist
### Description

数据范围:\(1<=n<=10^5,1<=k<=18,1<=k_i<=10^7,\sum |s_i|<=3*10^5\)
Solution
因为\(k\)比较小所以显然是拿\(k\)来搞事
比较简单粗暴的想法是,我们直接预处理出每个完全图中的一个点(好吧其实就是团==)到其他的完全图中一个点的最短距离,然后用这个东西来计算两个点之间的最短路就方便很多了
首先可以用一个\(mp[i][j]\)表示团\(i\)到团\(j\)的最短距离,这个数组在初始化的话直枚举每个节点,然后任选这个点所在团中的两个,取两个团的边权的最小值作为直接连接这两个团的距离,也就是初始的\(mp[i][j]\),然后floyd一下就得到完整的\(mp\)数组了
接下来考虑怎么用这个玩意计算两个节点的最短路
考虑固定一个起点\(x\),我们要计算\(x\)到其他点的最短路,我们可以先用预处理出的\(mp\)数组算出\(x\)到任意一个团\(j\)中的一个点(非\(x\))的最短路,记\(dis[j]\),具体一点的话就是枚举\(x\)先走一步到团\(i\)与团\(j\)的最短路的起点,然后直接走最短路到团\(j\)中某个节点,也就是\(min(k[i]+mp[i][j])\)
然后\(x\)到\(y\)的最短路一定是\(y\)所属的团的\(dis\)值的最小值,所以我们考虑将\(dis\)排序,从小到大计算贡献,当前团\(j\)的贡献应该就是\(dis[j]\)乘上当前团中没有被前面的团所包含的节点的数量
现在考虑这个数量怎么计算
因为\(k\)比较小,所以我们可以把当前已经考虑完的团具体是哪些给压成一个二进制数\(nowst\)(为\(1\)表示还没有考虑),每一个原图中的节点\(x\)所属的团也压成一个二进制数\(st[x]\),如果说当前考虑的团中包含的一个节点\(x\)满足\(st[x]|nowst=nowst\),那么说明这个节点不属于前面考虑的任何一个团,即有\(1\)的贡献,所以现在的问题就变成了对于每一个团\(i\)我们要预处理一个\(cnt[i][j]\)表示该团满足\(st[x]|j=j\)的节点\(x\)有多少个,这个东西的计算。。跟某fwt题里面的操作一样
然后我们只要枚举固定的起点\(x\)然后按照上面的步骤计算贡献就ok了
需要注意的是每次计算贡献的时候因为我们的\(dis\)处理出来的是\(x\)走到另外一个点的距离,也就是意味着我们在算的时候会把\(x\)到\(x\)的距离算成\(x\)走到排序后第一个团中某个其他节点的距离,所以需要判一下(减掉就好了),以及最后的答案要除以\(2\)(因为每条边算了\(2\)次)
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e5+10,ST=(1<<18)+10;
const ll inf=1LL<<60;
ll mp[20][20];
int rec[20][N],cnt[20][ST],w[20];
ll dis[20];
int st[N],ord[N];
int n,m;
ll ans;
int St(int x){return 1<<x-1;}
int in(int st,int x){return st>>x-1&1;}
void prework(){
for (int i=1;i<=n;++i){
for (int j=1;j<=m;++j){
if (!in(st[i],j)) continue;
++cnt[j][st[i]];
for (int k=1;k<=m;++k)
if (in(st[i],k))
mp[j][k]=min(mp[j][k],1LL*w[k]);
}
}
for (int k=1;k<=m;++k)
for (int i=1;i<=m;++i){
if (i==k||mp[i][k]==inf) continue;
for (int j=1;j<=m;++j){
if (j==k||j==i||mp[k][j]==inf) continue;
mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
}
}
for (int i=1;i<=m;++i)
for (int j=0;j<m;++j)
for (int k=0;k<1<<m;++k)
if (!(k>>j&1))
cnt[i][k|(1<<j)]+=cnt[i][k];
}
bool cmp(int x,int y){return dis[x]<dis[y];}
void solve(){
ll tmp;
int nowst;
for (int x=1;x<=n;++x){
for (int i=1;i<=m;++i) dis[i]=inf,ord[i]=i;
for (int i=1;i<=m;++i){
if (!in(st[x],i)) continue;
for (int j=1;j<=m;++j)
dis[j]=min(dis[j],mp[i][j]+w[i]);
}
sort(ord+1,ord+1+m,cmp);
nowst=(1<<m)-1;
tmp=-dis[ord[1]];
for (int i=1;i<=m;++i){
tmp+=dis[ord[i]]*cnt[ord[i]][nowst];
nowst^=St(ord[i]);
}
ans+=tmp;
}
printf("%lld\n",ans/2);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int x;
scanf("%d%d",&n,&m);
for (int i=1;i<=m;++i){
for (int j=1;j<=m;++j) mp[i][j]=i==j?0:inf;
scanf("%d%d",&w[i],&rec[i][0]);
for (int j=1;j<=rec[i][0];++j){
scanf("%d",&x);
rec[i][j]=x;
st[x]|=St(i);
}
}
prework();
solve();
}
Dist的更多相关文章
- Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (dist) on project hadoop-kms: An Ant BuildException has occured
编译cdh版hadoop2.5.0出现的问题 系统: CentOs66 64位 JDK:1.7 Maven: 3.0.5 Protobuf: libprotoc 2.5.0 编译命令: mvn pac ...
- Spring官网下载dist.zip的几种方法
Spring官网下载dist.zip的几种方法 Spring官网改版后,很多项目的完整zip包下载链接已经隐掉了,虽然Spring旨在引导大家用更“高大上”的maven方式来管理所依赖的jar包, ...
- Excel 使用CHIINV函数和GAMMA.DIST函数绘制卡方分布
1.使用CHIINV(概率,自由度),在Excel中绘制卡方分布. 若n个独立的随机变量均服从标准正态分布,则这n个随机变量的平方和构成一新的随机变量,其分布规律称为服从自由度为ν 的χ2分布. 2. ...
- 官网下载Spring dist
新版Spring官网下载Spring的dist可真是麻烦 跟着下面的贴图走吧,有些在网页的下面,需要打开相应页面后往下拉拉. 下载完后解压lib里面就是各种jar包了 真是麻烦啊,不好找,不过Spri ...
- 每R一点:层次聚类分析实例实战-dist、hclust、heatmap等(转)
聚类分析:对样品或指标进行分类的一种分析方法,依据样本和指标已知特性进行分类.本节主要介绍层次聚类分析,一共包括3个部分,每个部分包括一个具体实战例子. 1.常规聚类过程: 一.首先用dist()函数 ...
- express整合webpack的打包文件dist
对于我来说,第一次接触前后端整合问题的小白,刚开始是一脸懵逼,这个问题整整坑了我一个晚上加一个早上,现在写出来总结: 前端开发:vue-cli+webpack: 后台开发:nodejs框架expres ...
- make、make clean、make install、make uninstall、make dist、make distcheck和make distclean
Makefile在符合GNU Makefiel惯例的Makefile中,包含了一些基本的预先定义的操作:make根据Makefile编译源代码,连接,生成目标文件,可执行文件.make clean清除 ...
- vue项目通过webpack打包生成的dist文件放到express环境里运行(vue+webpack+express)
1.首先需要的原料肯定是vue打包生成的dist文件 在vue项目目录下运行:npm run build,等待运行结束,会在项目目录下生成一个dist文件夹,里面会生成一些文件(如下图示) 小的项目文 ...
- 关于Vue修改默认的build文件存放的dist路径
原文地址:http://www.cnblogs.com/JimmyBright/p/7681086.html Vue默认build路径是项目的dist目录下,有时候我们可能希望build之后的文件自动 ...
- jzoj6099. 【GDOI2019模拟2019.4.1】Dist
题目链接:https://jzoj.net/senior/#main/show/6099 考虑直接统计某个点到其它所有点的距离和 我们先把整个团当成一个点建图,处理出任意两个团之间的距离\(dis(i ...
随机推荐
- 20155204《网络对抗》Exp9 Web安全基础实践
20155204<网络对抗>Exp9 Web安全基础实践 一.基础问题回答 SQL注入攻击原理,如何防御? 原理: SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击者可以 ...
- Eclispe与JDK
一.Eclispe 1.1 Eclispe发布版本 下面是目前已知的版本代号 (Release)[2015年2月] Eclipse 3.1 版本代号 IO [木卫1,伊奥] Eclipse 3.2 版 ...
- 异步编程之asyncio简单介绍
引言: python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病.然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率,弥补了python性能方面的短板. as ...
- vsftp在防火墙开启需要开放的端口
1.开放tcp端口 firewall-cmd --zone=public --add-port=20/tcp --permanent firewall-cmd --zone=public --add- ...
- Go语言简单学习
GO 支持goroutine 和通道,并且推荐使用消息而不是共享内存来进行并发编程,总体来说,Go语言是一个非常现代化的语言,精小但非常强大 Go语言的主要特性: 1.自动垃圾回收 2.更丰富的内置类 ...
- js中文汉字按拼音排序
JavaScript 提供本地化文字排序,比如对中文按照拼音排序,不需要程序显示比较字符串拼音. String.prototype.localeCompare 在不考虑多音字的前提下,基本可以完美实现 ...
- Redis学习笔记之Redis的对象
类型与编码: typedef struct redisObject { unsigned type:4://类型 unsigned encod ...
- 《linux内核分析》作业一:分析汇编代码
通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的(王海宁) 姓名:王海宁 学号:20135103 课程:<Linux内核分析& ...
- 实训一(cocos2d-x相关)
实训内容简介: 大四开始前系里安排的的集中实践环节,根据要求,开发app应用软件. 目标app:Stick_mxj 目的:继续对cocos2d-x的学习,完成实践环节,解决现在对引擎不是很清楚的一些问 ...
- 更新pip10后 ImportError: cannot import name ‘main'
百度了几个回答都没有解决问题,有些回答明显是直接复制过来的一点价值都没有,然后google一下立马解决.很多时候不能怪搜索引擎,问题出在一些国内网友对知识的不负责任 解决:找到报错文件,也就是那个pi ...