【问题描述】
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 ≤ 50; 对于50%的评测用例,1 ≤ n ≤ 100,1 ≤ m ≤ 5000; 对于80%的评测用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 50000; 对于100%的评测用例,1 ≤ n ≤ 10000,1 ≤ m ≤ 100000,1 ≤ a, b ≤ n,1 ≤ c ≤ 1000。输入保证每个城市都可以通过铁路达到首都。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 #include <stack> #include <iostream> #include <vector> #include <queue> #define MAX 10000 #define INF 1e6 using namespace std;bool vis[MAX+1 ];int cost[MAX+1 ];int dis[MAX+1 ];struct node { int num; int cost; node (int nn,int cc):num (nn),cost (cc){ } bool operator < (const node&p)const { return cost>p.cost; } }; struct edge { int v; int cost; edge (int vv,int cc):v (vv),cost (cc){ } }; vector<edge> g[MAX+1 ]; int n;priority_queue<node> pq; void dij () { for (int i=1 ;i<=n;i++) { dis[i]=INF; cost[i]=INF; vis[i]=false ; } dis[1 ]=0 ; cost[1 ]=0 ; pq.push (node (1 ,0 )); while (!pq.empty ()){ node t=pq.top (); pq.pop (); if (vis[t.num]) continue ; vis[t.num]=true ; for (int i=0 ;i<g[t.num].size ();i++){ edge e=g[t.num][i]; if (vis[e.v]) continue ; int tmpcost=e.cost; if (tmpcost+dis[t.num]<dis[e.v]){ dis[e.v]=tmpcost+dis[t.num]; cost[e.v]=tmpcost; pq.push (node (e.v,dis[e.v])); } else if (tmpcost+dis[t.num]==dis[e.v]){ cost[e.v]=min (cost[e.v],tmpcost); } } } } int main () { int cases,src,u,v,w; cin>>n>>cases; for (int i=cases;i>0 ;i--){ cin>>u>>v>>w; g[u].push_back (edge (v,w)); g[v].push_back (edge (u,w)); } dij (); int ans=0 ; for (int i=1 ;i<=n;i++){ ans+=cost[i]; } cout<<ans<<endl; }