就是普通的最短路,建圖時點的距離小於m的連雙向邊,自認為寫了很多最短路卻不知道怎麼記錄最短路的路徑。在鬆弛裡記錄就好了,每次鬆弛都記錄被鬆弛點的前驅,這樣當乙個點多次鬆弛的時候,就可以多次更新它的前驅,當它無法鬆弛時就是最短路徑上的點,也就是記錄下來的最後一次鬆弛的前驅。
然後從終點開始遍歷前驅,存在陣列中反向輸出即可輸出最短路徑經過的點。
**如下:
1 #include2記錄最短路徑經過的點#define mem(a,b) memset(a,b,sizeof(a))
3const
int maxn = 650;4
const
double inf = 0x3f3f3f3f * 1.0;5
using
namespace
std;67
intn, k;
8double
m, dis[maxn];
9int
head[maxn], cnt, vis[maxn];
10int
pre[maxn];
1112
struct
node
13node[maxn];
1617
struct
edge
18edge[maxn *maxn];
2223
structn24
31}no;
3233
void add(int a, int b, double
c)34
4142
void
dij()
4368}69
}70}71
72int
main()
7389}90
}91dij();
92if(dis[n + 1] != inf * 1.0)93
103for(int i=len-1;i > 0;i--)
104 printf("
%d "
,ans[i]);
105 printf("
end\n");
106}
107else
108 printf("
-1\n");
109return0;
110 }
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號城市到其他城市的最短路,如果無法到達,輸出...
最短路 最短路徑問題
題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...
最短路徑演算法 最短路
在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...