要求輸出起點到終點的最短路徑及其花費,如果最短路徑有多條路線,則輸出花費最少的。
提示
更改dijkstra演算法中關於「更近」的評判標準:有兩條路徑,當他們距離不一樣時,距離小的更近;若距離一樣時,花費少的更近。
**
//節點之間不僅有距離還有花費,輸出距離最短並且花費最少的路徑
#include#includeusing namespace std;
struct e;
vectoredge[1001];
bool mark[1001];
int dis[1001];
int sum[1001];
int main()
//初始化鄰接鍊錶
while (m--)
//求單源最短路徑
cin >> s >> t;
dis[s] = 0;
mark[s] = true;//將s加入集合k
int newp = s;
for (int i = 1; i <= n; i++)
//判斷更新陣列的條件
//在本題條件下,當距離不同時,選距離最短的那條,當距離相同時,選擇花費最少的那條
if (dis[nextp] == -1 || dis[nextp] > dis[newp] + d || (dis[nextp] == dis[newp] + d&&sum[nextp] > sum[newp] + cost))
}//選擇路徑最短的節點,加入集合k
int min = 123123;
for (int j = 1; j <= n; j++)
if (dis[j] == -1)
if (min > dis[j])
}mark[newp] = true;
} cout << dis[t] << ' ' << sum[t] << endl;
cin >> n >> m;
} return 0;
}
Dijkstra 單源最短路徑
演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...
Dijkstra 單源最短路徑
演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...
Dijkstra單源最短路徑
dijkstra單源最短路徑 給定乙個帶權有向圖g v,e 其中每條邊的權是乙個非負實數。另外,還給定 v 中的乙個頂點,稱為源。現在我們要計算從源到所有其他各頂點的最短路徑長度。這裡的長度是指路上各邊權之和。這個問題通常稱為單源最短路徑問題。下面給出兩個計算單源最短路徑的模板。dijkstra 簡...