做了一下午終於a了這題,談談心得。
這題主要思路是這樣的,在spfa中加入計數操作,如果這個點的最短路可以更新但還未被更新既
if(dis[v]>dis[u]+1)那麼很顯然,目前我們可以知道的可到達這個點的最短路就是通過先到達上個點再走當前邊的方式,易推得**
ans[v]=ans[u];當乙個點不能被當前點更新時,判斷如果這個點的距離等於當前點距離+1的話,那麼就如同上面的情況,可到達這個點的最短路有一種是通過先到達上個點再走當前邊的方式得到的,那麼我們就把這個情況加上,可得**
ans[v]+=ans[u]將這個計數方法放到spfa的模板中就可以ac本題
幾個注意事項
1.邊加邊膜 防止爆int
2.ans[1]=1。因為很顯然,從一到一的最短路有且只有一條、
3.存雙向邊
4.自環和重邊並不會對本題造成影響
貼上ac**
#includeusing附ac時間namespace
std;
const
int mod=100003
;const
int maxn=1000010
;const
int maxn=5000010
;const
int maxn=0x7fffffff
;struct
stedge[maxn];
int n,m,cnt=0
,dis[maxn];
inthead[maxn],vis[maxn],ans[maxn];
inline
void add_edge(int u,int
v)inline
void spfa(int
s) }
else
if(dis[v]==dis[u]+1
) }
}}int
main()
spfa(1);
for(int i=1;i<=n;++i) printf("
%d\n
",ans[i]);
return0;
}
裂屏推薦本人部落格,希望互相學習
洛谷 P1144 最短路計數
題目描述 給出乙個n個頂點m條邊的無向無權圖,頂點編號為1 n。問從頂點1開始,到其他每個點的最短路有幾條。輸入輸出格式 輸入格式 輸入第一行包含2個正整數n,m,為圖的頂點數與邊數。接下來m行,每行兩個正整數x,y,表示有一條頂點x連向頂點y的邊,請注意可能有自環與重邊。輸出格式 輸出包括n行,每...
洛谷 P1144 最短路計數
給出乙個nn個頂點mm條邊的無向無權圖,頂點編號為1 n1 n。問從頂點11開始,到其他每個點的最短路有幾條。輸入格式 第一行包含22個正整數n,mn,m,為圖的頂點數與邊數。接下來mm行,每行22個正整數x,yx,y,表示有一條頂點xx連向頂點yy的邊,請注意可能有自環與重邊。輸出格式 共nn行,...
洛谷 P1144 最短路計數
給出乙個nn個頂點mm條邊的無向無權圖,頂點編號為1 n1 n。問從頂點11開始,到其他每個點的最短路有幾條。第一行包含22個正整數n,mn,m,為圖的頂點數與邊數。接下來mm行,每行22個正整數x,yx,y,表示有一條頂點xx連向頂點yy的邊,請注意可能有自環與重邊。共nn行,每行乙個非負整數,第...