ccf201609-4交通規劃
阿新 • • 發佈:2018-12-10
試題編號: | 201609-4 |
試題名稱: | 交通規劃 |
時間限制: | 1.0s |
記憶體限制: | 256.0MB |
問題描述: |
問題描述 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 評測用例規模與約定 對於20%的評測用例,1 ≤ n ≤ 10,1 ≤ m |
//dijsktra演算法改進一下即可 #include "stdafx.h" #include <iostream> #include <vector> using namespace std; const int max1 = 10005; const long long inf = 1 << 30; struct edge { int to; long long len; }edge1; vector<vector<edge> > mp(max1); long long cost[max1]; bool visit[max1]; int path[max1]; long long minlen = 0; void df(int n, int start) { int i,last=0; for (i = 1; i <= n; i++) { cost[i] = inf; visit[i] = false; path[i] = 0; } cost[start] = 0; path[start] = start; while (1) { long long tem = inf; int j = -1; for (i = 1; i <= n; i++) { if (cost[i]<tem && !visit[i]) { tem = cost[i]; j = i; } } if (j == -1)break; visit[j] = true; minlen += cost[j] - cost[path[j]]; for (i = 0; i <mp[j].size(); i++) { if (!visit[mp[j][i].to]) { if (mp[j][i].len + cost[j] < cost[mp[j][i].to]|| (mp[j][i].len + cost[j] == cost[mp[j][i].to]&& mp[j][i].len<cost[mp[j][i].to] - cost[path[mp[j][i].to]])) { cost[mp[j][i].to] = mp[j][i].len + cost[j]; path[mp[j][i].to] = j; } } } } } int main() { int n, m, i, a, b;long long c; cin >> n >> m; for (i = 0; i<m; i++) { cin >> a >> b >> c; edge1.to = b; edge1.len = c; mp[a].push_back(edge1); edge1.to = a; mp[b].push_back(edge1); } df(n, 1); cout << minlen; cin >> i; }