J-xay loves Floyd

ANJHZ题解
abcdhhhh_题解

  1. 如果di,j=wi,j\text d_{i,j}=\text w_{i,j}di,j​=wi,j​,那么按照题意中的算法仍然能得到正确的结果。此时记cani,j=1\text{can}_{i,j}=1cani,j​=1。

  2. 如果存在vvv,使得①cani,v=1\text{can}_{i,v}=1cani,v​=1②canv,j=1\text{can}_{v,j}=1canv,j​=1③vvv在iii到jjj的任意一条最短路上,那么cani,j=1\text{can}_{i,j}=1cani,j​=1。

直接这么算can[i][j]can[i][j]can[i][j]复杂度太高,我们注意到can[i][∗]can[i][*]can[i][∗],can[∗][j]can[*][j]can[∗][j]的运算本质上是集合求交,可以利用bitset维护。
将can[i][∗]can[i][*]can[i][∗]记为bitset<N> fr[i],can[∗][j]can[*][j]can[∗][j]记为bitset<N>to[j]

同时,枚举sss,则sss到jjj的所有最短路经过的点集potj\text{pot}_jpotj​也可以通过bitset维护,具体做法是每次枚举一个sss,就重新把顶点按照到sss的最短路长度排序,从小到大计算potj\text{pot}_jpotj​。如果ds,k+wk,j=ds,j\text d_{s,k}+\text w_{k,j}=\text d_{s,j}ds,k​+wk,j​=ds,j​,则potj∣=potk\text{pot}_j|=\text{pot}_kpotj​∣=potk​

时间复杂度O(nmlog⁡m+n2ww)O(nm\log m+\frac{n^2w}{w})O(nmlogm+wn2w​)

Code

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}
const int N=2005,M=5005;
int h[N],e[M],ne[M],w[M],idx;
void add(int a,int b,int c){e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;}
int d[N][N];
int n,m;
bool st[N];
bitset<N> pot[N],fr[N],to[N];void dij(int s,int d[])
{memset(st,0,sizeof st);priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;q.push({d[s]=0,s});while(q.size()){int u=q.top().second;q.pop();if(st[u]) continue;st[u]=1;for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(d[v]>d[u]+w[i]) {d[v]=d[u]+w[i];q.push({d[v],v});}}}for(int i=h[s];i!=-1;i=ne[i]){int v=e[i];if(w[i]==d[v]) fr[s][v]=to[v][s]=1;}
}
int solve(int s)
{static int id[N];for(int i=1;i<=n;i++){pot[i].reset();pot[i].set(i);}for(int i=1;i<=n;i++) id[i]=i;sort(id+1,id+1+n,[&](const int i,const int j){return d[s][i]<d[s][j];});for(int i=1;i<=n;i++){int u=id[i];for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(d[s][u]+w[i]==d[s][v]) pot[v]|=pot[u];}}for(int i=1;i<=n;i++)if(d[s][i]==0x3f3f3f3f||(pot[i]&fr[s]&to[i]).count()) fr[s][i]=to[i][s]=1;return fr[s].count();
}
int main()
{n=rd(),m=rd();memset(d,0x3f,sizeof d);memset(h,0xff,sizeof h);for(int i=1;i<=n;i++){fr[i].reset();fr[i][i]=1;to[i].reset();to[i][i]=1;}while(m--){int u=rd(),v=rd(),c=rd();add(u,v,c);}for(int i=1;i<=n;i++) dij(i,d[i]);int ans=0;for(int i=1;i<=n;i++) ans+=solve(i);printf("%d\n",ans);
}

2021牛客暑期多校训练营7 J-xay loves Floyd(最短路+bitset优化集合交)相关推荐

  1. 【2021牛客暑期多校训练营7】xay loves trees(dfs序,维护根出发的链)

    F xay loves trees 题意: 给出两棵树,由这两棵树根据规则可以生成一个图,规则如下:如果u , v在第一棵树中满足其中一个点是另一个点祖先且最终所有所选的点都互相联通,在第二棵树中满足 ...

  2. 【2021牛客暑期多校训练营7 】 xay loves count

    题目:点这里 要求:给出一组数,求满足 的i,j,k有多少个 分析:列举ak,对每一个找出满足题意的i,j然后计算有多少个(三个数可以相同,找i,j的范围是0~sqrt(ak): 下面还是队友代码时间 ...

  3. 2021牛客暑期多校训练营9

    2021牛客暑期多校训练营9 题号 题目 知识点 A A Math Challenge B Best Subgraph C Cells D Divide-and-conquer on Tree E E ...

  4. 2021牛客暑期多校训练营5

    2021牛客暑期多校训练营5 题号 题目 知识点 A Away from College B Boxes 概率 C Cheating and Stealing D Double Strings 线性d ...

  5. 2021牛客暑期多校训练营4

    2021牛客暑期多校训练营4 题号 题目 知识点 A Course B Sample Game C LCS D Rebuild Tree E Tree Xor 思维+线段树 F Just a joke ...

  6. 2021牛客暑期多校训练营3

    2021牛客暑期多校训练营3 题号 题目 知识点 A Guess and lies B Black and white C Minimum grid 二分图匹配 D Count E Math 数论+打 ...

  7. 2021牛客暑期多校训练营2

    2021牛客暑期多校训练营2 题号 题目 知识点 A Arithmetic Progression B Cannon C Draw Grids D Er Ba Game E Gas Station F ...

  8. 2021牛客暑期多校训练营1

    2021牛客暑期多校训练营1 题号 题目 知识点 难度 A Alice and Bob 博弈论 B Ball Dropping 计算几何 签到 C Cut the Tree D Determine t ...

  9. 2021牛客暑期多校训练营2,签到题CDFKI

    2021牛客暑期多校训练营2 题号 标题 已通过代码 通过率 团队的状态 A Arithmetic Progression 点击查看 6/72 未通过 B Cannon 点击查看 34/104 未通过 ...

  10. 2021牛客暑期多校训练营1, 签到题DFBG

    2021牛客暑期多校训练营1 题号 标题 已通过代码 通过率 团队的状态 A Alice and Bob 点击查看 1365/5586 通过(博弈论-打表) B Ball Dropping 点击查看 ...

最新文章

  1. html在线缓存视频,javascript – 如何为HTML视频添加缓冲
  2. 李宏毅深度学习——深度学习介绍
  3. Linux 退出vi编辑模式
  4. java bean状态_无状态和有状态企业Java Bean
  5. java9 堆外内存_java堆外内存泄漏排查
  6. Bootstrap3 插件的事件
  7. 安卓actionBar上无法显示搜索按钮如何解决
  8. matlab2c使用c++实现matlab函数系列教程-atan函数
  9. 菜鸟数据中台技术演进之路
  10. jenkins邮件配置(系统邮件和插件)
  11. 小程序源码:首席省钱赚钱专家微信小程序源码下载,淘宝客 外卖侠 外卖cps 首席多多客 八合一小程序源码
  12. SSRF深度解析Gopher协议
  13. PyTorch学习之误差反向传播
  14. JSON与聚合数据不解之缘二
  15. 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)
  16. 数据平台初试(产品篇)——监控大屏初露面
  17. Android 开发 VectorDrawable 矢量图 (三)矢量图动画
  18. (一)微信小程序云开发之上传图片(全流程讲解)
  19. 转载 Swift方法的多面性
  20. 【Java的反射机制】

热门文章

  1. python 什么可以作为变量名_为什么强烈禁止开发人员使用isSuccess作为变量名
  2. eclipse访问别人 mysql数据库_eclipse访问mysql数据库!
  3. rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)
  4. Hadoop 中zoo_0基础如何入门HADOOP
  5. 读取oracle bfile字段,ORACLE中BFILE字段的使用研究_oracle
  6. java 反射 int_Java 反射由浅入深 | 进阶必备
  7. [JavaWeb-JavaScript]JavaScript概念与功能
  8. [设计模式]迪米特法则
  9. [剑指offer]面试题18:树的子结构
  10. I - Interesting Permutation Gym - 102394I(排列组合)