一張\(n(n\le5\times10^4)\)個點\(m(m\le5\times10^4)\)條邊的無向圖,節點編號為\(1\)到\(n\),邊權為正整數。給定\(s\)和\(t\),顯然從\(s\)到\(t\)的最短路有一種或多種方案。
選擇\(a,b\)兩個點,約定\(a\)點和\(b\)點必須滿足:
所有可能路徑中,必定會經過\(a\)點和\(b\)點中的任意一點;
所有可能路徑中,不存在一條路徑同時經過\(a\)點和\(b\)點。
求滿足上面兩個條件的\(a,b\)點對有多少個,交換\(a,b\)的順序算相同的方案。
首先用dijkstra求出最短路網路,顯然這是乙個dag。
在dag上dp求出乙個點到\(s/t\)的方案數,將它們相乘即為經過這個點的路徑數,記作\(f(i)\)。我們同樣也可以用bitset
求出經過這個點的路徑上可能經過的點,記作\(s(i)\)。
而題目所求的\(a\)和\(b\)相當於需要滿足以下兩個條件:
\(f(a)+f(b)=f(t)\);
\(a\notin f(b)\)且\(b\notin f(a)\)。
顯然列舉\(a\)和\(b\)會超時,由於\(f(a)+f(b)=f(t)\)。我們可以開乙個map
儲存\(f(b)=f(t)-f(a)\)的可能的\(b\)。
此時我們只需要列舉\(a\),然後在map
上查詢對應的\(b\)即可。
#include#include#include#include#include#include#include#includeinline int getint()
typedef long long int64;
const int n=5e4+1,m=5e4;
struct edge2 ;
edge2 edge[m];
struct edge3 ;
std::vectore3[n];
inline void add_edge(const int &u,const int &v,const int &w) );
e3[v].push_back((edge3));
}bool vis[n];
int n,m,s,t,ind[n],ind2[n],outd[n];
int64 diss[n],dist[n],f[n],g[n],ans;
struct vertex
};inline void dijkstra(const int &s,int64 dis) );
} while(!q.empty()&&q.top().d!=llong_max)
std::queueq;
std::bitsetb[n];
inline void kahn2()
} int cnt=0;
for(register int i=1;i<=n;i++) cnt+=!vis[i];
kahn2();
kahn();
kahn3();
for(register int i=1;i<=n;i++)
for(register int i=1;i<=n;i++)
printf("%lld\n",ans);
return 0;
}
「大吉大利 晚上吃雞」背後有隱藏劇情
絕地求生 大逃殺 成為了新一輪網路紅詞的締造者,如幻影坦克 蹲在草叢裡 伏地魔 趴在任何可能的地方 幻影汽車 藏在汽車下 和車庫伏兵 藏在車庫周圍 而真正最為所有人所熟知的,則是 大吉大利 晚上吃雞 和 平底鍋 兩個。較之過去遊戲結束時出現的 win game over 顯然 大吉大利 晚上吃雞 英...
大吉大利 今晚吃雞 槍械
題目描述 在絕地求生 吃雞 遊戲裡,不同的槍枝有不同的威力,更是可以搭配不同的配件,以提公升槍枝的效能。每一把槍都有其威力及其可裝備配件種類。每乙個配件有其所屬種類,可以為槍枝提供威力的百分比加成。每一把槍只能裝備乙個同類配件。給你n把槍枝和m個配件,槍的威力為p,可裝備的配件數量為k,為k個不同型...
大吉大利,今晚吃雞 槍械篇
在絕地求生 吃雞 遊戲裡,不同的槍枝有不同的威力,更是可以搭配不同的配件,以提公升槍枝的效能。每一把槍都有其威力及其可裝備配件種類。每乙個配件有其所屬種類,可以為槍枝提供威力的百分比加成。每一把槍只能裝備乙個同類配件。給你n把槍枝和m個配件,槍的威力為p,可裝備的配件數量為k,為k個不同型別的配件,...