九度OJ 1008 最短路徑問題

2021-07-14 02:49:40 字數 1401 閱讀 1425

題目描述:給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。

輸入:輸入n,m,點的編號是1~n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t;起點s,終點t。n和m為0時輸入結束。

(1輸出:輸出 一行有兩個數, 最短距離及其花費。

樣例輸入:

3 2

1 2 5 6

2 3 4 5

1 30 0

樣例輸出:

9 11

這些用dijkstra解決的圖論問題還是很常見的。這道題在常規題的基礎上加上了每條路的花費。但在本質上絲毫不影響最短路的演算法思想。

其實只要在每次更新dis[j]的時候,也更新一次s[j],它表示從起點到j點的花費最小值,特別要注意的是,當dis[j]和dis[k]+map[k][j]相等的時候,不更新dis[j],但要更新s[j],因為相等的距離,題目要求花費的最小值,所以這種情況要注意一下。

另外,陣列不要開太小,像我第一次開到1000,邊界值沒注意到,就沒過。還有給定的max應該大一些。

#include #include #define max 1<<29

using namespace std;

int map[1010][1010];

int cost[1010][1010];

bool visit[1010];

int dis[1010]; //表示從起點到各點的距離

int s[1010]; //表示從起點到各點的花費

int n,m;

void dijkstra(int start,int end)

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

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

}visit[k] = 1;

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

else if(!visit[j] && dis[j] == (dis[k]+map[k][j]))}}

cout<>n>>m)

int a,b,d,p;

for(int i=0;i>a>>b>>d>>p;

map[a][b] = map[b][a] = d;

cost[a][b] = cost[b][a] = p;

}int start,end;

cin>>start>>end;

dijkstra(start,end);

}return 0;

}

最短路徑問題 九度 OJ 1008

在該題中不僅需要求得起點到終點的最短距離,還需要在有多條最短路徑的時,選取花費最少的那一條。要解決這個問題,只要更改 dijstra 演算法中關於 更近 的評判標準即可 有兩條路徑,若它們距離不一樣時,距離小的更近 若距離一樣時花費少的更近。當定義這種新的評判標準後,dijstra 演算法照樣能求得...

九度OJ 1008最短路徑問題

題目1008 最短路徑問題時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 3219 解決 963 題目描述 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入 輸入n,m,點的編號是1 ...

OJ 1008 最短路徑問題

include using namespace std const int n 1001 const int inf 100000000 typedef struct map map ma n n map temp n void init int n void dijkstra int s,int ...