次短路計數

2021-09-26 15:30:07 字數 1630 閱讀 5123

時間限制: 2000 ms         記憶體限制: 65536 kb

提交數: 86     通過數: 16 

給定一張包含nn個點、mm條邊的有向圖,並且給定起始點ss和終點tt,求從ss到tt的最短路線和比最短路線多乙個單位距離的路線的總方案數。(兩條路線a、ba、b不同當且僅當存在一條邊 ∈a∈a且∉b∉b)。

輸入包含多組資料。

第一行包含乙個整數tt表示測試資料的個數。對於每組測試資料:

第一行包含兩個整數n,mn,m,分別表示圖中點的數量和邊的數量。

接下來mm行,每行包含33個整數x,y,wx,y,w,表示有一條從xx連向yy的(x≠yx≠y)權值為ww的單向邊。

最後一行包含兩個整數s,ts,t,資料保證s≠ts≠t且至少有一條從ss到tt的路線。

對於每組資料,輸出乙個整數表示總方案數,保證所有資料都在109109的範圍內。

2

5 81 2 3

1 3 2

1 4 5

2 3 1

2 5 3

3 4 2

3 5 4

4 5 3

1 55 6

2 3 1

3 2 1

3 1 10

4 5 2

5 2 7

5 2 7

4 1

3

2

【資料規模及約定】

對於100%的資料,滿足2≤n≤1000,1≤m≤10000,1≤x,y,s,t≤n,1≤c≤10002≤n≤1000,1≤m≤10000,1≤x,y,s,t≤n,1≤c≤1000。

這道題目就是類似dp,利用dijkistra求出最短路和次短路,然後利用加法原理統計方案,然後看**,邏輯還是比較清晰的

#include#include#include#includeusing namespace std;

int head[2005],nxt[20005],to[20005],wei[20005],dis[2005][2],ans[2005][2],vis[2005][2],cnt=1,n,m,s,t;

int read()

return res;

}void add(int u,int v,int w)

void init()

struct node

bool operator > (const node& other)const);

while(!q.empty()));

}dis[v][0]=d+w;

ans[v][0]=ans[u][c];

q.push((node));

}else if(dis[v][0]==d+w)else if(dis[v][1]>d+w));

}else if(dis[v][1]==d+w)}}

}int main()

s=read(),t=read();

solve();

if(dis[t][1]==dis[t][0]+1)else

}return 0;

}

有乙個坑點是,dijkistra的判重部分必須要用標記陣列,不能用dis[u][1]
最短路與次短路計數

poj 3464 問最短路的條數 比最短路權值大 1 的條數 做法 比較一下次短路和最短路的值 若次短路恰好比最短路大1,答案為最短路 次短路條數,否則答案就是最短路條數 1 include2 const int inf 0x3f3f3f3f 3 class count short path e m...

最短路計數,次短路計數

acwing 1134.最短路計數 bfs 每個點只出隊一次,且入隊一次 dijkstra 每個點第一次出隊的序列一定滿足拓撲序 bellman ford spfa 出隊的時候都不一定是滿足最小,每個點可能出隊多次,有可能更新前面已經出隊的點,不具備拓撲序 但是要用 spfa 求最短路徑數,也是可以...

poj3463 最短路和次短路 計數

這道題就是讓你求出有向圖中最短路和比最短路長1的路的數量,我們求出次短路和最短路的數量即可解決這道題 求s到t的最短路與次短路 這裡要求只比最短路多1 的條數之和 聯想到最小,次小的一種更新關係 if x 最小 更新最小,次小 else if 最小 更新方法數 else if x 次小 更新次小 e...