CCF 交通规划 100分

快来打我* 2023-05-28 08:23 47阅读 0赞























试题编号: 201609-4
试题名称: 交通规划
时间限制: 1.0s
内存限制: 256.0MB
问题描述:

问题描述

  G国国王来中国参观后,被中国的高速铁路深深的震撼,决定为自己的国家也建设一个高速铁路系统。
  建设高速铁路投入非常大,为了节约建设成本,G国国王决定不新建铁路,而是将已有的铁路改造成高速铁路。现在,请你为G国国王提供一个方案,将现有的一部分铁路改造成高速铁路,使得任何两个城市间都可以通过高速铁路到达,而且从所有城市乘坐高速铁路到首都的最短路程和原来一样长。请你告诉G国国王在这些条件下最少要改造多长的铁路。

输入格式

  输入的第一行包含两个整数n, m,分别表示G国城市的数量和城市间铁路的数量。所有的城市由1到n编号,首都为1号。
  接下来m行,每行三个整数a, b, c,表示城市a和城市b之间有一条长度为c的双向铁路。这条铁路不会经过ab以外的城市。

输出格式

  输出一行,表示在满足条件的情况下最少要改造的铁路长度。

样例输入

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。输入保证每个城市都可以通过铁路达到首都。

思路:

在Dijkstra求最短路径的基础上,加入prim的思想,加入cost数组。

cost[u] = 10。表明在已有的最短路径的基础上,想要把u也和首都连通起来,那么需要的最小花费是10。这个很像prim,这里的cost不像Dijkstra中的dis数组,用来求从源点到目的点的最短路径,而是像prim中的dis数组,用来求把这个点加入到连通图中的最小代价。

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<vector>
  4. using namespace std;
  5. const int MAXN = 10002;
  6. const int INF = 999999;
  7. struct Node{
  8. int v;
  9. int w;
  10. Node(int v,int w){
  11. this->v = v;
  12. this->w = w;
  13. }
  14. };
  15. vector<Node> adj[MAXN];
  16. int dis[MAXN];
  17. bool vis[MAXN];
  18. int cost[MAXN];
  19. void Dijkstra(int s,int n){
  20. fill(dis,dis+n+1,INF);
  21. dis[s] = 0;
  22. cost[s] = 0;
  23. for(int i=1;i<=n;i++){
  24. int u = -1;
  25. int minDis = INF;
  26. for(int j=1;j<=n;j++){
  27. if(!vis[j] && minDis > dis[j]){
  28. minDis = dis[j];
  29. u = j;
  30. }
  31. }
  32. if(u == -1){
  33. break;
  34. }
  35. vis[u] = true;
  36. for(int j=0;j<adj[u].size();j++){
  37. int v = adj[u][j].v;
  38. int w = adj[u][j].w;
  39. if(!vis[v]){
  40. if(dis[v] > dis[u] + w){
  41. dis[v] = dis[u] + w;
  42. cost[v] = w; //花费就是从u--->v的距离(prim思想)
  43. }else if(dis[v] == dis[u] + w){
  44. cost[v] = min(cost[v],w); //(prim思想)
  45. }
  46. }
  47. }
  48. }
  49. }
  50. int main(){
  51. int n,m;
  52. int u,v,w;
  53. cin>>n>>m;
  54. while(m--){
  55. cin>>u>>v>>w;
  56. adj[u].push_back(Node(v,w));
  57. adj[v].push_back(Node(u,w));
  58. }
  59. Dijkstra(1,n);
  60. int ans = 0;
  61. for(int i=1;i<=n;i++){
  62. ans += cost[i];
  63. }
  64. cout<<ans<<endl;
  65. return 0;
  66. }

发表评论

表情:
评论列表 (有 0 条评论,47人围观)

还没有评论,来说两句吧...

相关阅读

    相关 CCF 交通规划

    一、试题 问题描述   G国国王来中国参观后,被中国的高速铁路深深的震撼,决定为自己的国家也建设一个高速铁路系统。   建设高速铁路投入非常大,为了节约建设成本,