最短路徑 Floyd,Dijkstra(王道)

2022-06-24 11:00:13 字數 2687 閱讀 1041

題目描述:

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t-shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?

輸入:輸入包括多組資料。每組資料第一行是兩個整數n、m(n<=100,m<=10000),n表示成都的大街上有幾個路口,標號為1的路口是商店所在地,標號為n的路口是賽場所在地,m則表示在成都有幾條路。n=m=0表示輸入結束。接下來m行,每行包括3個整數a,b,c(1<=a,b<=n,1<=c<=1000),表示在路口a與路口b之間有一條路,我們的工作人員需要c分鐘的時間走過這條路。輸入保證至少存在1條商店到賽場的路線。

當輸入為兩個0時,輸入結束。

輸出:對於每組輸入,輸出一行,表示工作人員從商店走到賽場的最短時間。

樣例輸入:

2 1

1 2 3

3 31 2 5

2 3 5

3 1 2

0 0

樣例輸出:

3

2floyd:時間複雜度為o(n^3),利用二維矩陣,當兩個節點之間有多餘的一條邊,選擇最小的邊權值存入鄰接矩陣

適合要求詢問多個節點對之間的最短路徑長度問題。

#include #include

using

namespace

std;

intmain()

while(m--)

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

printf(

"%d\n

",ans[1][n]);//

迴圈結束後輸出答案

}

return0;

}

dijkstra:時間複雜度為o(n^2),空間複雜度為o(n),適合從某乙個特定的起點出發,到達其他所有節點的最短路徑。

#include #include

#include

using

namespace

std;

struct e;

intmain()

for(int i=1;i<=n;i++)

dis[

1]=0;//

得到最近的點為節點1,長度為0

mark[1]=true;//

將節點1加入集合k

int newp=1;//

集合k中新加入的點為節點1

for(int i=1;i//

迴圈n-1次,按照最短路徑遞增的順序確定其他n-1個點的最短路徑長度

for(int j=0;j//

遍歷與該新加入集合k中的節點直接相鄰的邊

int t=edge[newp][j].next;//

該邊的另乙個節點

int c=edge[newp][j].cost;//

邊的長度

if(mark[t]==true)//

如另乙個邊也屬於集合k,跳過

continue

;

if(dis[t]==-1||dis[t]>dis[newp]+c)

dis[t]=dis[newp]+c;//

更新距離資訊

}

int min=123123123;//

最小值初始化

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

}mark[newp]=true;//

新加入的點加入集合k

} printf(

"%d\n

",dis[n]);

}return0;

}

類似題目:網路的核(可以練練手)

題目描述

給定乙個無向網路g,網路中共包含n個節點(從1n編號),m條無向邊,求該網路的核。

網路的核:到網路中其他節點的距離之和最小的節點。且對於不連通的兩點,我們認為它們之間的距離為n,如果有多租借,輸出編號最小的節點。

輸入格式

輸入的第一行是乙個整數tt<=25),表示輸入的資料組數。,

對於每組測試資料:

第一行有兩個整數n,m(1<=n<=50,0<=m<=n*(n-1)/2),表示網路中有n個點,m條邊。

接下來的m行,每行兩個整數u,v(1<=u,v<=n,u!=v),表示點u和點v之間有一條距離為1的邊。任意兩個點之間最多隻會有一條邊相連。

輸出格式

對於每組測試資料,輸出網路的核。

輸入樣例

3 31 2

1 32 3

4 21 2

2 3輸出樣例

Codeup最短路徑 最短路徑

n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離。第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路,接下來m行兩個整數,表示相連的兩個城市的編號。n 1行,表示0號城市到其他城市的最短路,如果無法到達,輸出...

Codeup最短路徑 最短路徑問題

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...

最短路徑之最短路徑問題

提交 狀態 討論版 命題人 外部匯入 題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的 任務是找出從一點到另一點之間的最短路徑。輸入共n m 3行,...