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 ...
随机推荐
- SpingMVC的<context:component-scan>包扫描踩坑记录
公司项目配置的Spring项目的包扫描有点问题,出现了一个被Spring容器管理的Bean被创建了2次的现象.在此记录下解决的过程,方便后续查阅. 改动前: 容器启动监听器中会扫描全部包,创建 ...
- PYQT5实现控制台显示功能
首先,写一个信号,用来发射标准输出作为信号 class EmittingStream(QtCore.QObject): textWritten = QtCore.pyqtSignal(str) #定义 ...
- WPF编程,将控件所呈现的内容保存成图像的一种方法。
原文:WPF编程,将控件所呈现的内容保存成图像的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/detai ...
- 【来龙去脉系列】AutoMapper一款自动映射框架
前言 通常在一个应用程序中,我们开发人员会在两个不同的类型对象之间传输数据,通常我们会用DTOs(数据传输对象),View Models(视图模型),或者直接是一些从一个service或者Web AP ...
- idea 开启 tomcat 访问日志记录
all 为 设置为 查看所有类型的请求 (包括ajax)
- mybatis 初步使用(IDEA的Maven项目, 超详细)
目录 创建 Maven 项目 Maven配置 pom.xml 创建数据库 配置Mybatis 配置mybatis的XML文件 创建实体类和对应的Mapper.xml 测试 源码 @ 创建 Maven ...
- Windows中的键盘快捷方式
Windows 中的键盘快捷方式 适用于: Windows 10Windows 8.1Windows 7 Windows 10 键盘快捷方式就是按键或按键组合,可提供一种替代方式来执行通常使用鼠标执行 ...
- 转 git config命令使用
. git config简介 我们知道config是配置的意思,那么git config命令就是对git进行一些配置.而配置一般都是写在配置文件里面,那么git的配置文件在哪里呢?互动一下,先问下大家 ...
- 博客目录 Blog directory
Linux 学习笔记 Linux/Mac 挂载远程服务器目录到本地 --Mount remote server directory to local PC 远程连接服务器端Jupyter Notebo ...
- OpenCV操作像素
在了解了图像的基础知识和OpenCV的基础知识和操作以后,接下来我们要做的就对像素进行操作,我们知道了图像的本质就是一个矩阵,那么一个矩阵中存储了那么多的像素,我们如何来操作呢?下面通过几个例子来看看 ...