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 ...
随机推荐
- Python算法基础
一.简介 定义和特征 定义:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时 ...
- 20155233 《网络对抗》Exp7 网络欺诈技术防范
应用SET工具建立冒名网站 1.要让冒名网站在别的主机上也能看到,需要开启本机的Apache服务,并且要将Apache服务的默认端口改为80,先在kali中使用netstat -tupln |grep ...
- 20155304《网络对抗》Exp4 恶意代码分析
20155304<网络对抗>Exp4 恶意代码分析 实践内容 1.系统运行监控 1.1使用schtasks指令监控系统运行 我们在C盘根目录下建立一个netstatlog.bat的文本文件 ...
- MySql+Socket 完成数据库的增查Demo
需求: 利用MySql数据库结合前端技术完成用户的注册(要求不使用Web服务技术),所以 Demo采用Socket技术实现Web通信. 第一部分:数据库创建 数据库采用mysql 5.7.18, 数据 ...
- 利用RMAN转移裸设备到文件系统
本文只是为了个人备忘. 参考eagyle的:http://www.eygle.com/archives/2005/12/oracle_howto_move_datafile_raw.html 我首先挂 ...
- C语言学习之枚举类型
前言 枚举(enum)类型是计算机编程语言中的一种数据类型.枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内.例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等.如果把 ...
- 蓝牙disable流程简述
蓝牙关闭的流程比打开流程要简单,主要就是一些profile的断连以及协议栈相关结构的释放. 这里简单说一下其流程,就直接从协议栈的disable的接口说起了. static int disable(v ...
- [LOJ#6033]. 「雅礼集训 2017 Day2」棋盘游戏[二分图博弈、匈牙利算法]
题意 题目链接 分析 二分图博弈经典模型,首先将棋盘二分图染色. 考虑在某个最大匹配中: 如果存在完美匹配则先手必败,因为先手选定的任何一个起点都在完美匹配中,而后手则只需要走这个点的匹配点,然后先手 ...
- effective c++ 笔记 (49-52)
//---------------------------15/04/27---------------------------- //#49 了解new-handler的行为 { /* 1:在o ...
- selenium+python自动化----xlrd,xlswriter
1.准备: 使用之前需要先按照:打开cmd,输入pip install xlrd(xlswriter),点击enter; 2.基本使用: xlrd: #打开els文件,参数是文件路径: table = ...