日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2021牛客暑期多校训练营7 J-xay loves Floyd(最短路+bitset优化集合交) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

J-xay loves Floyd

ANJHZ題解
abcdhhhh_題解

  • 如果di,j=wi,j\text d_{i,j}=\text w_{i,j}di,j?=wi,j?,那么按照題意中的算法仍然能得到正確的結(jié)果。此時(shí)記cani,j=1\text{can}_{i,j}=1cani,j?=1

  • 如果存在vvv,使得①cani,v=1\text{can}_{i,v}=1cani,v?=1canv,j=1\text{can}_{v,j}=1canv,j?=1vvviiijjj的任意一條最短路上,那么cani,j=1\text{can}_{i,j}=1cani,j?=1

  • 直接這么算can[i][j]can[i][j]can[i][j]復(fù)雜度太高,我們注意到can[i][?]can[i][*]can[i][?]can[?][j]can[*][j]can[?][j]的運(yùn)算本質(zhì)上是集合求交,可以利用bitset維護(hù)。
    can[i][?]can[i][*]can[i][?]記為bitset<N> fr[i],can[?][j]can[*][j]can[?][j]記為bitset<N>to[j]

    同時(shí),枚舉sss,則sssjjj的所有最短路經(jīng)過(guò)的點(diǎn)集potj\text{pot}_jpotj?也可以通過(guò)bitset維護(hù),具體做法是每次枚舉一個(gè)sss,就重新把頂點(diǎn)按照到sss的最短路長(zhǎng)度排序,從小到大計(jì)算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?

    時(shí)間復(fù)雜度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); }

    總結(jié)

    以上是生活随笔為你收集整理的2021牛客暑期多校训练营7 J-xay loves Floyd(最短路+bitset优化集合交)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。