Dijkstra迪傑斯特拉演算法 貪心

2021-07-29 06:57:33 字數 2680 閱讀 8450

最短路徑問題。我們通過一道ccf真題來講解。

問題描述

g國國王來中國參觀後,被中國的高速鐵路深深的震撼,決定為自己的國家也建設乙個高速鐵路系統。

建設高速鐵路投入非常大,為了節約建設成本,g國國王決定不新建鐵路,而是將已有的鐵路改造成高速鐵路。現在,請你為g國國王提供乙個方案,將現有的一部分鐵路改造成高速鐵路,使得任何兩個城市間都可以通過高速鐵路到達,而且從所有城市乘坐高速鐵路到首都的最短路程和原來一樣長。請你告訴g國國王在這些條件下最少要改造多長的鐵路。

輸入格式

輸入的第一行包含兩個整數n, m,分別表示g國城市的數量和城市間鐵路的數量。所有的城市由1到n編號,首都為1號。

接下來m行,每行三個整數a, b, c,表示城市a和城市b之間有一條長度為c的雙向鐵路。這條鐵路不會經過a和b以外的城市。

輸出格式

輸出一行,表示在滿足條件的情況下最少要改造的鐵路長度。

樣例輸入

4 5

1 2 4

1 3 5

2 3 2

2 4 3

3 4 2

樣例輸出

11 兩種解法:

第一種定義乙個資料結構:

#include 

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

// v表示節點,cost表示出發點到v點的距離

typedef

struct node

// 優先佇列將按距離從小到大排列

friend

bool

operator

<(node n1,node n2)

}node;

// v表示邊的另一端節點,cost表示該邊的權重

typedef

struct edge

}edge;

vector

g[10005];//無向圖

bool marked[10005];//標誌陣列,false表示該點沒有被訪問,true表示已經被訪問

接通該點需要增加的邊的權重.即表示相鄰點到該點需要花費的路徑長度(此陣列可以去掉重複邊)

int costo[10005];

int disto[10005];//表示起點到該點的總距離(用於在計算的過程中取最小)

//用以記錄到每乙個點的最短距離所經過的點

/* *p[v][w] = 1表示起點到v點的途中經過w點

*p[v][w] = 0表示起點到v點的途不中經過w點

*/int p[10005][10005];

int n,m;

void dijstra(int sta)

costo[sta] = disto[sta] = 0;

priority_queueq;

q.push(node(sta,0));

while(!q.empty())

p[vv][vv] = 1;

}else

if(disto[vv]==newdis)

p[vv][vv] = 1;

costo[vv] = cost;

}//costo[vv] = min(costo[vv],cost);}}

}}

}int main()

dijstra(1);

int sum = 0;

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

cout

}cout

0;}

方法二:直接利用陣列不用結構體

#include 

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

//獲取d陣列中的最小值

int getmin(int d,int finals,int n)

}return flag;

}int main()

}costo[1] = 0;

for(int i=0;iint a,b,c;

cin>>a>>b>>c;

road[a][b] = c;

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

//初始化

d[1] = 0;road[1][1] = 0;

//制空路徑,初始化p陣列

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

if(d[i]1] = 1;p[i][i] = 1;}

}//開始dijkstra演算法

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

p[j][j] = 1;

}else

if(finals[j]==0&&(mins+road[k][j])==d[j])}}

int sum = 0;

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

cout

return

0;}

Dijkstra(迪傑斯特拉)演算法

迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。指定乙個節點,例如我們要計算 a 到其他節點的最短路徑 引入兩個集合 s u s集合包含已求出的最短路徑的點 以及相...

dijkstra迪傑斯特拉演算法

注意 1.標頭檔案climits的int max,加上2整數會溢位,每次相加前得判斷被加值是否為int max,int max 10為負數 2.得先初始化再對d s c s g,cost等賦值 fill d 0 d 0 max,int max fill g 0 0 g 0 0 max max,int...

迪傑斯特拉 Dijkstra 演算法

迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。通過dijkstra計算圖g中的最短路徑時,需要指定起點s 即從頂點s開始計算 dijkstra演算法算是貪心思想實...