最短路徑問題。我們通過一道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演算法算是貪心思想實...