題目大意:
存在幾個城市1~n;每個城市任意連向其他城市。並且,路程也是不盡相同的。若從乙個城市出發,去各個城市,則去各個城市每乙個城市的最短路程計算出來。
如下是幾個城市的地圖:
題目分析:乙個城市可能有多個路徑,但是尋找最小的路徑卻不容易。
演算法:貪心演算法:從1城市出發,到達4和5城市最小路徑的充分必要條件是到達前面每乙個城市都是最短路徑——及貪心演算法中區域性最優解,構成全域性最優解
資料結構:用map這樣的矩陣記錄每個城市的路的大小。dist記錄每個城市的最短路程。p記錄前乙個城市,這樣就能找到全部路線。flag記錄
每個城市是否找到最短的路程。免得重複查詢。
1.初始化部分
void init(int map[max], int dist, int p, bool flag)
cin >> n;
for (int i = 0; i <= n; i++)
p[i] = -1;
flag[i] = false; //當flag為假時,則還不為最短路程
dist[i] = maxnum;
for (int j = 0; j <= n; j++)
map[i][j] = maxnum;
//操作
p[1] = 0;
dist[1] = 0;
map[1][1] = 0;
flag[1] = true;
將map內全部初始化為極大的數
注意:在這裡先讓1城市帶入了。
2.輸入塊兒
void cinfun(int map[max], int dist, int p, bool flag)
cin >> m;
//資料的輸入
int num = m;
while (num--)
int u, k, l;
cin >> u >> k >> l;
map[u][k] = l;
3.尋找在flag為假中dist的最小的城市。並,找到與他相連的城市。比較相連城市的目前的dist去該城市的dist加上這兩個城市的距離。
若小,則說明走該城市到相連城市是更短的路徑。(核心!!!!)
void minfun(int map[max], int dist, int p, bool flag)
for (int i = 2; i <= n; i++)
if (dist[i] > map[1][i])
dist[i] = map[1][i];
p[i] = 1;
m--;
while (m--)
//演算法:在v_s中尋找最小路徑x。
int min = 0;
for (int i = 1; i <= n; i++)
if (dist[i] < dist[min]&&!flag[i]) min = i;
//通過dis[k]>dist[x]+map[x][k]時改變該路程
for (int i = 1; i <= n; i++)
if (!flag[i])
if (map[min][i] != maxnum)
if (dist[i] > dist[min] + map[min][i])
dist[i] = dist[min] + map[min][i];
p[i] = min;
flag[min] = true;
**如下:
#include
using namespace std;
//資料結構map記錄路線情況,
//dist記錄最短路徑,
//q記錄前驅,
//flag記錄是否為已經是最短路徑
#define max 100
#define maxnum 1000
int map[max][max];
int dist[max], p[max];
bool flag[max];
int n;
int m;
void init(int map[max], int dist, int p, bool flag);
void cinfun(int map[max], int dist, int p, bool flag);
void minfun(int map[max], int dist, int p, bool flag);
int main()
//初始化
init(map, dist, p, flag);
//輸入資料
cinfun(map, dist, p, flag);
//最小值
minfun(map, dist, p, flag);
for (int i = 1; i <= n; i++)
cout << "城市:" << i << "前乙個城市:" << p[i] << endl;
cout << "最短路程是:" << dist[i] << endl << endl;
return 0;
void init(int map[max], int dist, int p, bool flag)
cin >> n;
for (int i = 0; i <= n; i++)
p[i] = -1;
flag[i] = false; //當flag為假時,則還不為最短路程
dist[i] = maxnum;
for (int j = 0; j <= n; j++)
map[i][j] = maxnum;
//操作
p[1] = 0;
dist[1] = 0;
map[1][1] = 0;
flag[1] = true;
void cinfun(int map[max], int dist, int p, bool flag)
cin >> m;
//資料的輸入
int num = m;
while (num--)
int u, k, l;
cin >> u >> k >> l;
map[u][k] = l;
void minfun(int map[max], int dist, int p, bool flag)
for (int i = 2; i <= n; i++)
if (dist[i] > map[1][i])
dist[i] = map[1][i];
p[i] = 1;
m--;
while (m--)
//演算法:在v_s中尋找最小路徑x。
int min = 0;
for (int i = 1; i <= n; i++)
if (dist[i] < dist[min]&&!flag[i]) min = i;
//通過dis[k]>dist[x]+map[x][k]時改變該路程
for (int i = 1; i <= n; i++)
if (!flag[i])
if (map[min][i] != maxnum)
if (dist[i] > dist[min] + map[min][i])
dist[i] = dist[min] + map[min][i];
p[i] = min;
flag[min] = true;
python貪心演算法最短路徑 最短路徑純貪心演算法。
dijkstra演算法,書上其實說的很簡潔,仔細看,仔細思考是會理解的.但要先理解幾條引論和推理.而自己思考的思路在不需要任何推理只從貪心思路出發,和dijkstra有所不同,但本質一樣,那麼自己按照理解,試著慢慢講下.一,問題 從某個源點,到其他各點的最短路徑.注意,不要想成某乙個點,到某個點的最...
貪心演算法《最短路徑》
題目大意 存在幾個城市1 n 每個城市任意連向其他城市。並且,路程也是不盡相同的。若從乙個城市出發,去各個城市,則去各個城市每乙個城市的最短路程計算出來。如下是幾個城市的地圖 題目分析 乙個城市可能有多個路徑,但是尋找最小的路徑卻不容易。演算法 貪心演算法 從1城市出發,到達4和5城市最小路徑的充分...
最短路徑純貪心演算法。
dijkstra演算法,書上其實說的很簡潔,仔細看,仔細思考是會理解的.但要先理解幾條引論和推理.而自己思考的思路在不需要任何推理只從貪心思路出發,和dijkstra有所不同,但本質一樣,那麼自己按照理解,試著慢慢講下.一,問題 從某個源點,到其他各點的最短路徑.注意,不要想成某乙個點,到某個點的最...