python貪心演算法最短路徑 貪心演算法《最短路徑》

2021-10-13 04:24:23 字數 3655 閱讀 4090

題目大意:

存在幾個城市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有所不同,但本質一樣,那麼自己按照理解,試著慢慢講下.一,問題 從某個源點,到其他各點的最短路徑.注意,不要想成某乙個點,到某個點的最...