路由選擇(最短路,次短路,第三短路)

2022-03-14 12:22:24 字數 1994 閱讀 9350

題目描述:

在網路通訊中,經常需要求最短路徑。但完全用最短路徑傳輸有這樣乙個問題:如果最終在兩個終端節點之間給出的最短路徑只有一條。則在該路徑中的任乙個節點或鏈路出現故障時,訊號傳輸將面臨中斷的危險。因此,對網路路由選擇作了以下改進:

為任意兩節點之間通訊提供三條路徑供其選擇,即最短路徑、第二最短路徑和第三最短路徑。

第一最短路徑定義為:給定乙個不含負迴路的網路d=,其中v=,a為邊的集合,w為權的集合,設p1是d中最短(v1,vn)路。稱p1為d中最短(v1,vn)路徑,如果d中有一條(v1,vn)路,p2滿足以下條件:

(1)p2≠p1;(2)d中不存在異於p1的路p,使得:

(3)w(p1)≤w(p)< w(p2)

則稱p2為d的第二最短路徑。

第三最短路徑的定義為:設p2是d中第二最短(v1,vn)路徑,如果d中有一條(v1,vn)路p3滿足以下條件:

(1)p3≠p2並且p3≠p1;(2)d中不存在異於p1,p2的路p,使得:

(3)w(p2)≤w(p)< w(p3)

則稱p3為d中第三最短路徑。

現給定一有n個節點的網路,n≤30,求給定兩點間的第

一、第二和第三最短路徑。

輸入描述:

輸入: n s t max (每格數值之間用空格分隔)

m11 m12 … m1n

m21 m22 … m2n

… …

mn1 mn2 … mnn

其中,n為節點數,s為起點,t為終點,max為一代表無窮大的整數,mij描述i到j的距離,若mij=max,則表示從i到j無直接通路,mii=0。

輸出描述 output description

輸出:三條路徑(從小到大輸出),每條路徑佔一行,形式為:路徑長度 始點…終點 (中間用乙個空格分隔)

樣例輸入:

5 1 5 10000

0 1 3 10000 7

10000 0 1 10000 10000

10000 10000 0 1 4

10000 10000 10000 0 1

10000 1 10000 10000 0

樣例輸出:

4 1 2 3 4 5

5 1 3 4 5

6 1 2 3 5

#include

#include

using

namespace

std;

int n,from,to,maxn,map[31][31];

int tot,pre[31],ans1,ans2,ans3;

int a1[31],a2[31],a3[31];

bool flag[31];

void print()

void work()

if(a1[1])

ans1=tot;

memset(a1,0,sizeof(a1));

while(tmp)

return;

}else

if(totif(a2[1])

ans2=tot;

memset(a2,0,sizeof(a2));

while(tmp)

return;

}else

if(totmemset(a3,0,sizeof(a3));

while(tmp)

return;

}}void search(int u)

}int main()

最短路與次短路計數

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

Dijkstra求最短路與次短路

花了乙個晚上加上午兩節課的時間來思考這個問題,一開始進了個誤區,後來發現不對,找到了正確思路,現在來做個總結 最短路 假設有如下 無向圖 每條邊有權,要求從a到g的最短路,設陣列d i 用來記錄每個點到a的最短路,d用來記錄權值d 0 0。先來說一下我一開始的誤區,在看了一些介紹這個演算法的文章後我...

POJ 3463 最短路 次短路

本題是求最短路和比最短路距離長1的次短路的個數,於是就用到了dijkstra 主要的改變就是陣列都開到了二維,第二維用來表示是最短路還是次短路 比如d陣列和vis陣列 而cnt陣列使用來訪問最短路和次短路的次數 那麼最外層的迴圈就要到2 n 1次了,其中n 1次是用來求最短路的,還有n次是次短路的 ...