貪心算法之Dijkstra
阿新 • • 發佈:2018-06-03
CI 不能 space const stream out lag 起點 !=
貪心算法的主要思想就是通過不斷求解局部最優解,最後求出最優解或者最優解的近似值,不能保證一定為最優解。
Dijistra算法,選取沒有選擇過的點到已經選擇過得點組成的集合中最短的距離的點。然後更新已選擇的點到沒有選擇的點的距離。
已經選擇的點是一個整體。
具體算法如下:
#include <iostream> #include <stack> using namespace std; const int IDF = 1e7; //距離最大值 const int N = 100; //點的數量最大值 int map[N][N]; //點與點之間的距離 int n; //點的數量 intm; //線的數量 int dist[N]; //源點到其他點的距離 bool flag[N]; //是否已加入找到集 int p[N]; //記錄路徑 void Dijkstr(int u); //計算距離 void findpath(int u); int main() { int u, v, w; //起點 終點 權重 cout << "請輸入點的個數:"; cin >> n; cout << "請輸入線的數量:"; cin >> m; //初始化 for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) { map[i][j] = IDF; } } cout << "請輸入兩點及兩點之間的距離:" << endl; while (m > 0) { cin >> u >> v >> w; map[u][v] = min(w, map[u][v]); m--; } cout << "請輸入起點:"; cin >> u; cout<< "信息輸入完畢,開始計算地傑斯特拉距離" << endl; Dijkstr(u); findpath(u); return 0; } void findpath(int u) { int temp; stack<int> s; cout<<"源點為:"<<u<<endl; for(int i = 0; i < n; i++){ temp = p[i]; while(temp != -1){ s.push(temp); temp = p[temp]; } cout<<u<<"到"<<i<<"的距離為:"<<dist[i]<<";路徑為:"; while(!s.empty()){ cout<<s.top()<<"--"; s.pop(); } cout<<i<<endl; } } void Dijkstr(int u) { //初始化 for (int i = 0; i < n; i++) { dist[i] = map[u][i]; flag[i] = false; if(dist[i] == IDF) p[i] = -1; else p[i] = u; } //初始化起點 dist[u] = 0; flag[u] = true; for (int j = 0; j < n; j++) {//找n次 //從沒有找到的點中找最近的 int temp = IDF; int t = u; for (int i = 0; i < n; i++) { if (flag[i] == false && dist[i] < temp) { temp = dist[i]; t = i; } } if (t == u) { //沒有找到 原距離不變 return; } //更新距離 找到t點 flag[t] = true; for (int i = 0; i < n; i++) { if (flag[i] == false && map[t][i] + dist[t] < dist[i]) { dist[i] = map[t][i] + dist[t]; p[i] = t; } } } }
貪心算法之Dijkstra