洛谷P1144 最短路計數(BFS)

2021-08-08 23:05:08 字數 1218 閱讀 4436

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

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

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

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

5 71 2

1 32 4

3 42 3

4 54 511

1241到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。

由於是無權圖,可以用bfs解

由於邊比較稀疏,因此用鏈結表表示該圖。在鏈結表的每條邊中,需要記錄每兩個頂點之間的邊的數量num。

在考察乙個頂點u的後繼結點v時,如果v沒有被訪問過,則記錄到v的最短路徑數量為:u的最短路的數量*u到v邊的數量,且v的深度depth[v]=depth[u]+1;如果v已訪問過,且depth[u]+1 = depth[v],則到v的最短路的數量加上:u的最短路的數量*u到v邊的數量。

#include 

#include

#include

#include

#include

#include

#include

#include

using namespace std; #define mod 100003 #define n 1000003 int n, m, vis[n] = , result[n] = , depth[n] = ; struct node void set(int t1) void add_one() }; vector

g[n]; int get_i() return ans; } void bfs(){ int i, j, k; queue

q; q.push(1); result[1] = 1; vis[1] = 1; depth[1] = 0; while(!q.empty()){ k = q.front(); q.pop(); for(i=0; i

洛谷P1144 最短路計數(bfs)

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

洛谷P1144 最短路計數 BFS

給出乙個 n 個頂點 m 條邊的無向無權圖,頂點編號為 1 n 問從頂點 1 開始,到其他每個點的最短路有幾條,可能有自環與重邊。輸出 ans mod100003 後的結果即可。如果無法到達頂點 i 則輸出 0 用乙個 cnt 陣列記錄 1 點到達某個點的最短路徑的條數,如果在某個時候已經求出 u ...

洛谷 P1144 最短路計數

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