題目描述:
在網路通訊中,經常需要求最短路徑。但完全用最短路徑傳輸有這樣乙個問題:如果最終在兩個終端節點之間給出的最短路徑只有一條。則在該路徑中的任乙個節點或鏈路出現故障時,訊號傳輸將面臨中斷的危險。因此,對網路路由選擇作了以下改進:
為任意兩節點之間通訊提供三條路徑供其選擇,即最短路徑、第二最短路徑和第三最短路徑。
第一最短路徑定義為:給定乙個不含負迴路的網路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次是次短路的 ...