luogu P1608 路徑統計

2022-02-27 22:23:16 字數 1543 閱讀 6688

「rp餐廳」的員工素質就是不一般,在齊刷刷的算出同乙個**號碼之後,就準備讓hzh,tzy去送快餐了,他們將自己居住的城市畫了一張地圖,已知在他們的地圖上,有n個地方,而且他們目前處在標註為「1」的小鎮上,而送餐的地點在標註為「n」的小鎮。(有點廢話)除此之外還知道這些道路都是單向的,從小鎮i到j需要花費d[i,j]的時間,為了更高效快捷的將快餐送到顧客手中,

他們想走一條從小鎮1到小鎮n花費最少的一條路,但是他們臨出發前,撞到因為在路上堵車而生氣的fyy,深受啟發,不能僅知道一條路線,萬一。。。,於是,他們邀請fyy一起來研究起了下乙個問題:這個最少花費的路徑有多少條?

輸入格式:

輸入檔案第一行為兩個空格隔開的數n,e,表示這張地圖裡有多少個小鎮及有多少邊的資訊。

下面e行,每行三個數i、j、c,表示從i小鎮到j小鎮有道路相連且花費為c.(注意,資料提供的邊資訊可能會重複,不過保證i<>j,1<=i,j<=n)。

輸出格式:

輸出檔案包含兩個數,分別是最少花費和花費最少的路徑的總數.

兩個不同的最短路方案要求:路徑長度相同(均為最短路長度)且至少有一條邊不重合。

若城市n無法到達則只輸出乙個(『no answer』);

輸入樣例#1:

5 4

1 5 4

1 2 2

2 5 2

4 1 1

輸出樣例#1:

4 2

對於30%的資料 n<=20;

對於100%的資料 1<=n<=2000,0<=e<=n*(n-1), 1<=c<=10.

資料有重複,注意判重

#include#include

#include

using

namespace

std;

const

int n = 2200

;int

head[n];

struct

nodeedge[n*n/2

];int n,e,num=0,dis[n];bool

vis[n];

void add_edge(int x,int y,int

z)int

ans1,cnt[n];

int minn=0

;void spfa(int

x)

if(!vis[v])que.push(v),vis[v]=1

; }

else

if(dis[u]+edge[i].w==dis[v]) cnt[v]+=cnt[u];

}vis[u]=0;cnt[u]=0

; }

}int

main()

spfa(1);

if(dis[n]==0x3f3f3f3f

) puts(

"no answer");

else printf("

%d %d\n

",dis[n],cnt[n]);

return0;

}

題解 Luogu P1608 路徑統計

有一張 n n 2000 個點 m m n n 1 2 條邊的有向圖,每個邊的邊權為 c c 10 請求出從 1 到 n 的最短路以及最短路的條數。spfa dij 直接用 spfa 或者 dij 求最短路 本題解採用 spfa 在求最短路的時候多統計乙個陣列 cnt i 表示從 1 到 i 的最短...

Luogu P1608 路徑統計 最短路計數

頹了 重邊導致我乖乖用鄰接矩陣。好吧就是個最短路計數。如果更新時d v d u w i 就可以接起來,把兩個加在一起。如果d v d u w i 那麼c v 直接賦值為c u 相當於這個最短路是由u轉移過來的 include include include include define r regi...

P1608 路徑統計

aimee 很水的題目 只要把p1144改一下 需要注意的是這個題有重邊,求方案數的話一定要去重!這就涉及到很有趣的問題。要想成為頂尖高手 就要做到滴水不漏 橙汁哥 從這個題我才知道我寫的堆優化dijkstra複雜度有問題 tle起飛 include include include include ...