p1144 最短路計數
題目描述
給出乙個nn個頂點mm條邊的無向無權圖,頂點編號為1-n1−n。問從頂點11開始,到其他每個點的最短路有幾條。
輸入格式
第一行包含22個正整數n,mn,m,為圖的頂點數與邊數。
接下來mm行,每行22個正整數x,yx,y,表示有一條頂點xx連向頂點yy的邊,請注意可能有自環與重邊。
輸出格式
共nn行,每行乙個非負整數,第ii行輸出從頂點11到頂點ii有多少條不同的最短路,由於答案有可能會很大,你只需要輸出ans \bmod 100003ansmod100003後的結果即可。如果無法到達頂點ii則輸出00。
輸入輸出樣例
輸入 #1複製
5 71 2
1 32 4
3 42 3
4 54 5
輸出 #1複製11
124說明/提示
11到55的最短路有44條,分別為22條1-2-4-51−2−4−5和22條1-3-4-51−3−4−5(由於4-54−5的邊有22條)。
對於20%20%的資料,n ≤ 100n≤100;
對於60%60%的資料,n ≤ 1000n≤1000;
對於100%100%的資料,n<=1000000,m<=2000000n<=1000000,m<=2000000。
spfa用了優化了,其實沒必要,普通的佇列就行。
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int inf=
0x3f3f3f3f
;const
int maxn=
2000010
;struct nodes[maxn]
;int head[maxn]
,num,cnt[maxn]
,dis[maxn]
,vis[maxn]
;void
add(
int u,
int v)
void
spfa
(int x)
cnt[s[i]
.to]
=cnt[s[i]
.from]
;//覆蓋
}else
if(dis[s[i]
.to]
==dis[s[i]
.from]+1
)}}}
intmain()
spfa(1
);for(i=
1;i<=n;i++)if
(cnt[i]
==inf)
printf
("0\n");
else
printf
("%d\n"
,cnt[i]);
return0;
}
另一種解法:
因為所有的邊權都為1,所以乙個點的最短路就相當於是它在bfs搜尋樹中的深度。乙個點最短路一定經過了乙個層數比它少一的結點(否則不是最短路)。
所以用每個相鄰且層數比當前結點層數少一的點更新當前點的路徑跳數即可。
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int inf=
0x3f3f3f3f
;const
int maxn=
2000010
;struct nodes[maxn]
;int head[maxn]
,num,cnt[maxn]
,dis[maxn]
,vis[maxn]
,dep[maxn]
;void
add(
int u,
int v)
void
spfa
(int x)
if(dep[u]
==dep[t]+1
)}}}
intmain()
spfa(1
);for(i=
1;i<=n;i++
)printf
("%d\n"
,cnt[i]);
return0;
}
P1144 最短路計數
給出乙個nn個頂點mm條邊的無向無權圖,頂點編號為1 n1 n。問從頂點11開始,到其他每個點的最短路有幾條。輸入格式 第一行包含22個正整數n,mn,m,為圖的頂點數與邊數。接下來mm行,每行22個正整數x,yx,y,表示有一條頂點xx連向頂點yy的邊,請注意可能有自環與重邊。輸出格式 共nn行,...
P1144 最短路計數
給出乙個n個頂點m條邊的無向無權圖,頂點編號為1 n。問從頂點1開始,到其他每個點的最短路有幾條。輸入格式 輸入第一行包含2個正整數n,m,為圖的頂點數與邊數。接下來m行,每行兩個正整數x,y,表示有一條頂點x連向頂點y的邊,請注意可能有自環與重邊。輸出格式 輸出包括n行,每行乙個非負整數,第i行輸...
P1144 最短路計數
給出乙個n個頂點m條邊的無向無權圖,頂點編號為1 n。問從頂點1開始,到其他每個點的最短路有幾條。輸入格式 輸入第一行包含2個正整數n,m,為圖的頂點數與邊數。接下來m行,每行兩個正整數x,y,表示有一條頂點x連向頂點y的邊,請注意可能有自環與重邊。輸出格式 輸出包括n行,每行乙個非負整數,第i行輸...