這道題用一次spfa就可以過了。在求最短路的同時,對答案進行統計即可。
實現:\(dis_i\)表示從1到\(i\)的最短路(實在還是不懂的話看程式吧)。
當\(dis_i>dis_j+1\)時,直接令\(ans_i=ans_j\)即可。
當\(dis_i=dis_j+1\)時,那麼到\(i\)的路徑就可以多加上\(j\)的路徑,即\(ans_i=ans_i+ans_j\)。
**:
#include using namespace std;
int n , m , p = 100003;
int ans[1000010] , dis[1000010];
bool vis[1000010];
vectora[1000010];
queueq;
void spfa()
}else if(dis[y] == dis[x] + 1) ans[y] = (ans[y] + ans[x]) % p;
} vis[x] = 0; //出佇列了就可以標記未走過了,因為我們要重複更新這個點直到最優 }}
int main()
for(int i = 1; i <= n; i++) dis[i] = 0x7fffffff;
spfa();
for(int i = 1; i <= n; i++) cout << ans[i] << endl;
return 0;
}
P1144 最短路計數 題解
同步 原題鏈結 簡要題意 求從源點開始向各點出發,最短路的個數。注意到 出題人很善良 資料範圍很強,所以我們採用 spfa text spfa 在這之前如果你不懂最短路,請務必 左轉弱化模板 或學習 最短路模板 ok texttt ok,現在所有人都會了 spfa text spfa 這個演算法。為...
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行輸...