我們直接在spfa的過程中使用cnt陣列記錄最短路的個數,用dijkstra也可以!
更新cnt分情況:
如果dis[next]>dis[now]+1
那麼之前到達點next的路》dis[now]+1
cnt[next]=cnt[now]如果dis[next]==dis[now]+1
那麼之前到達點next的路也有距離為dis[now]+1的點。
cnt[next]+=cnt[now]#include using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define res register int
const int maxn=1e6+5;
vectorv[maxn];
int dis[maxn],vis[maxn];
int cnt[maxn];
int n,m,mod=100003;
//最短路的個數
void spfa()
}else if(dis[y]==dis[x]+1)}}
}} int main()
{ scanf("%d%d",&n,&m);
int from,to;
for(res i=0;i我們可以用vectorpre[maxn]記錄下每乙個節點被最短到達的前乙個點的節點序號。因為我們記錄的都是前驅,所以我們可以從終點出發。這樣遍歷到的每乙個節點都在最短路上面。然後我們dfs或者bfs,ans+每乙個遍歷到節點前驅的個數-1。最後輸出讓ans+1。
洛谷1144 最短路計數
題目描述 給出乙個n個頂點m條邊的無向無權圖,頂點編號為1 n。問從頂點1開始,到其他每個點的最短路有幾條。輸入輸出格式 輸入格式 輸入第一行包含2個正整數n,m,為圖的頂點數與邊數。接下來m行,每行兩個正整數x,y,表示有一條頂點x連向頂點y的邊,請注意可能有自環與重邊。輸出格式 輸出包括n行,每...
洛谷1144 最短路計數
給出乙個n個頂點m條邊的無向無權圖,頂點編號為1 n。問從頂點1開始,到其他每個點的最短路有幾條。大水題 為了備忘 還是記下來吧 不推方程了,in code 1 2 dijkstra 4 include5 include6 include7 include8 using namespace std ...
洛谷 1144 模板 最短路計數
問題描述 給出乙個n個頂點m條邊的無向無權圖,頂點編號為1 n。問從頂點1開始,到其他每個點的最短路有幾條。輸入 輸入第一行包含2個正整數n,m,為圖的頂點數與邊數。接下來m行,每行兩個正整數x,y,表示有一條頂點x連向頂點y的邊,請注意可能有自環與重邊。輸出 輸出包括n行,每行乙個非負整數,第i行...