luogu P1144 最短路計數

2022-02-28 03:48:32 字數 1357 閱讀 7959

給出乙個n個頂點m條邊的無向無權圖,頂點編號為1~n。問從頂點1開始,到其他每個點的最短路有幾條。

輸入格式:

輸入第一行包含2個正整數n,m,為圖的頂點數與邊數。

接下來m行,每行兩個正整數x, y,表示有一條頂點x連向頂點y的邊,請注意可能有自環與重邊。

輸出格式:

輸出包括n行,每行乙個非負整數,第i行輸出從頂點1到頂點i有多少條不同的最短路,由於答案有可能會很大,你只需要輸出mod 100003後的結果即可。如果無法到達頂點i則輸出0。

輸入樣例#1:

5 7

1 21 3

2 43 4

2 34 5

4 5

輸出樣例#1:

111

24

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

對於某個點i,一條到達他的最短路徑,必須經過乙個和i直接相連而且最短路長度比i小1的點x。、

下面是醜陋的**

#include#include

#include

using

namespace

std;

queue

que;

const

int n=200002

;const

int mod=100003

;int

dis[n];

intn,m;

inthead[n];

intcount[n];

intvis[n];

struct

nodeedge[n*2

];int num=0

;void add_edge(int x,int

y)void

spfa()

}else

if(dis[k]+1==dis[q])

count[q]=(count[q]+count[k])%mod;

}vis[k]=0

; }

for(int i=1;i<=n;i++)

printf(

"%d\n

",count[i]);

}int

main()

spfa();

return0;

}

Luogu P1144 最短路計數

這道題先跑乙個最短路,然後在用記憶化搜尋搜出最短路條數。開乙個 dis 陣列存最短路長度,開乙個 ans 陣列存答案。搜到乙個節點 v 尋找它能到達的每個節點 u 如果 dis u 1 dis v 說明用最短路的走法走到 u 後,直接走到 v 就都是 1 到 v 的一條合法最短路。此時,ans v ...

Luogu P1144 最短路計數

給出乙個n個頂點m條邊的無向無權圖,頂點編號為1 n。問從頂點1開始,到其他每個點的最短路有幾條。輸入格式 輸入第一行包含2個正整數n,m,為圖的頂點數與邊數。接下來m行,每行兩個正整數x,y,表示有一條頂點x連向頂點y的邊,請注意可能有自環與重邊。輸出格式 輸出包括n行,每行乙個非負整數,第i行輸...

C P1144 最短路計數

題目 p1144 最短路計數 他們居然說是水題,看來我還是太low了。用spfa求最短路,然後記錄有多少個相同的到該點的最短路。你忽略了重邊了嗎?include include include using namespace std const int maxn 0x7fffffff 3 int n...