1062 路由選擇

2022-05-03 11:51:16 字數 4299 閱讀 1535

時間限制: 1 s

空間限制: 128000 kb

題目等級 : 鑽石 diamond

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

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

第一最短路徑定義為:給定乙個不含負迴路的網路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)則稱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)則稱p3為d中第三最短路徑。

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

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

輸入描述 input description

輸入:  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

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

樣例輸入 sample input

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

樣例輸出 sample output

4  1  2  3  4  5

5  1  3  4  5

6  1  2  3  5

資料範圍及提示 data size & hint

分類標籤 tags 點此展開 

最短路圖論

題解:

暴力就好了,存路徑的時候注意處理一下。

第一次輸出路徑的遞迴寫炸了,re,25

#include#include

#include

using

namespace

std;

#define n 35

intn,s,t,maxn;

intf[n][n],dis[n][n],pre[n][n];

short

ans[n];

bool

vis[n][n];

void print(int

x)void

out(int

x)int

main()

}memcpy(f,dis,

sizeof

dis);

for(int k=1;k<=n;k++)}}

}}printf(

"%d

",dis[s][t]);

printf(

"%d

",s);ans[++ans[0]]=s;print(t);putchar('\n'

);

//for(int i=1;i<=ans[0];i++) printf("%d ",ans[i]);

int res=0x7fffffff

,jx,jy,u,v;

for(int i=1;i0];i++)}}

vis[jx][jy]=1

; printf(

"%d

",dis[s][t]+res);

int t=pre[s][jy];

pre[s][jy]=jx;

//cout

%d ",s);out(t);putchar('\n'

); pre[s][jy]=t;

res=0x7fffffff

;

for(int i=1;i0];i++)}}

printf(

"%d

",dis[s][t]+res);

pre[s][jy]=jx;

/*cout

printf(

"%d

",s);out(t);putchar('\n'

);

return0;

}

更新:floyed換成dijkstra;不再用遞迴輸出路徑

思路來自以前的次短路題目:最短路與次短路的關係,次短路與第三短路的關係同理)

題解:

dis[0][t]表示s->t的最短路;(1)

dis[1][t]表示s->t的次短路;(2)

dis[2][t]表示s->t的第三短路;(3)

step模擬vector存路徑

step[0][t][0]表示(1) s->t需要經過幾個點。輸出step[0][t][0]->step[0][t][step[0][t][0]]即可。

step[1][t][0],step[2][t][0]同樣

和普通dijkstra大致一樣,再加上三維表示更新哪一短路。

更新時,有三種情況:

1、有比最短路短的k:(3)=(2);(2)=(1);(1)=k;

2、有比次短路短的k:(2)=(1);(1)=k;

3、有比第三短路短的k:(1)=k;

1 2 3情況更新dis時,同時要更新step

詳見**。

ac**:

#include#define n 50

const

int inf=1000000009

;int

n;int d[n][n],dist[3][n],vis[3][n],step[3

][n][n];

void dijkstra(int

s) vis[u][v]=1

;

for(j=1;j<=n;j++)

if(v!=j)

else

if(!vis[1][j]&&k1

][j])

else

if(!vis[2][j]&&k2

][j])}}

}int

main()

}dijkstra(s);

printf(

"%d

",dist[0

][t]);

for(i=1;i<=step[0][t][0];i++) printf("

%d ",step[0][t][i]);printf("

%d\n

",t);

printf(

"%d

",dist[1

][t]);

for(i=1;i<=step[1][t][0];i++) printf("

%d ",step[1][t][i]);printf("

%d\n

",t);

printf(

"%d

",dist[2

][t]);

for(i=1;i<=step[2][t][0];i++) printf("

%d ",step[2][t][i]);printf("

%d\n

",t);

return0;

}

004 路由選擇協議

常見的路由選擇協議有 rip協議 ospf協議。路由資訊協議 英語 routing information protocol,縮寫 rip 是一種內部閘道器協議 igp 為最早出現的距離向量路由協定。屬於網路層,其主要應用於規模較小的 可靠性要求較低的網路,可以通過不斷的交換資訊讓路由器動態的適應網...

03 路由原理

二 路由原理 路由 routing 是指路由器從乙個介面上收到資料報,根據資料報的目的位址進行定向並 到另乙個介面的過程。路由 routing 是指分組從源到目的地時,決定端到端路徑的網路範圍的程序。以上是教科書給出的定義,所謂的路由,就是路由器對資料報從源位址到目標位址選擇路徑的過程。s 192....

3 路由配置

一 路由配置 path path 函式 匯入 from django.urls import path 語法 path route,views,name none 引數 1.route 字串型別,匹配的請求路徑 2.views 指定路徑所對應的檢視處理函式的名稱 3.name 為位址起別名,在模版中...