給出乙個n個頂點m條邊的無向無權圖,頂點編號為1~n。問從頂點1開始,到其他每個點的最短路有幾條。
輸入格式:
輸入第一行包含2個正整數n,m,為圖的頂點數與邊數。
接下來m行,每行兩個正整數x, y,表示有一條頂點x連向頂點y的邊,請注意可能有自環與重邊。
輸出格式:
輸出包括n行,每行乙個非負整數,第i行輸出從頂點1到頂點i有多少條不同的最短路,由於答案有可能會很大,你只需要輸出mod 100003後的結果即可。如果無法到達頂點i則輸出0。
輸入樣例#1:
5 71 21 3
2 43 4
2 34 5
4 5
輸出樣例#1:
11124
1到5的最短路有4條,分別為2條1-2-4-5和2條1-3-4-5(由於4-5的邊有2條)。
對於20%的資料,n ≤ 100;
對於60%的資料,n ≤ 1000;
對於100%的資料,n<=1000000,m<=2000000。
分析:spfa,進行spfa時順便數一下有幾條最短路,每一次更新時,說明以前記錄的都不是最短路,ans 更新成到達他的點的ans,相等時加上到他的點的ans。注意要取模
//gang
#include#include
#include
#include
#include
#include
#include
#define for(x,y,z) for(int x=y;x<=z;x++)
#define rep(x,y,z) for(int x=y;x>=z;x--)
#define ll long long
using
namespace
std;
const
int mod=100003
;int
n,m;
intx,y;
int hd[2000005
];bool book[2000005
];int dis[2000005
];int ans[2000005
];int
cnt;
struct
nodee[
2000005
];void add(int u,int v,int
dis)
void
spfa()
ans[v]=ans[u];
}else
if(dis[v]==dis[u]+e[i].dis)}}
}int
main()
spfa();
for(i,
1,n)
printf(
"%d\n
",ans[i]);
return0;
}
洛谷 P1144 最短路計數(最短路 SPFA)
傳送門 資料範圍看起來好像很嚇人,但我還是水過去了嘻嘻 先跑一遍spfa確定最短路長度,然後用記憶化搜尋累加答案 點1到點1的答案為1,然後遞迴搜尋,如果下乙個點在最短路徑上,我就把我的答案加上它的答案 code include include include struct nodea 400001...
洛谷 P1144 最短路計數 SPFA
題目描述 給出乙個nn個頂點mm條邊的無向無權圖,頂點編號為1 n1 n。問從頂點11開始,到其他每個點的最短路有幾條。輸入格式 第一行包含22個正整數n,mn,m,為圖的頂點數與邊數。接下來mm行,每行22個正整數x,yx,y,表示有一條頂點xx連向頂點yy的邊,請注意可能有自環與重邊。輸出格式 ...
最短路計數 spfa
題目描述 給出乙個n個頂點m條邊的無向無權圖,頂點編號為1 n。問從頂點1開始,到其他每個點的最短路有幾條。輸入輸出格式 輸入格式 輸入第一行包含2個正整數n,m,為圖的頂點數與邊數。接下來m行,每行兩個正整數x,y,表示有一條頂點x連向頂點y的邊,請注意可能有自環與重邊。輸出格式 輸出包括n行,每...