• 城市公交网建设问题


    【问题描述】
      有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权为在这两个城市之间修建高速公路的造价,研究后发现,这个地图有一个特点,即任一对城市都是连通的。现在的问题是,要修建若干高速公路把所有城市联系起来,问如何设计可使得工程的总造价最少?
    【输入格式】
        n(城市数,1<=n<=100)
      e(边数)
      以下e行,每行3个数i,j,wij,表示在城市i,j之间修建高速公路的造价。
    【输出格式】
      n-1行,每行为两个城市的序号,表明这两个城市间建一条高速公路。
    【输入样例】
      5 8
      1 2 2
      2 5 9
      5 4 7
      4 1 10
      1 3 12
      4 3 6
      5 3 3
      2 3 8
    【输出样例】
       1  2
       2  3
       3  4
       3  5
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 int maxn=0x7fffffff;
     6 int map[101][101];
     7 int minn[101];
     8 int vis[101];
     9 int vis2[101][101];
    10 int main()
    11 {
    12     int n,m;
    13     scanf("%d%d",&n,&m);
    14     for(int i=0;i<=n;i++)minn[i]=maxn;
    15     for(int i=0;i<=n;i++)
    16     for(int j=0;j<=n;j++)
    17     {
    18         if(i==j)
    19         map[i][j]=0;
    20         else
    21         map[i][j]=maxn;
    22     }
    23     for(int i=1;i<=m;i++)
    24     {
    25         int x,y,z;
    26         scanf("%d%d%d",&x,&y,&z);
    27         map[x][y]=z;
    28         map[y][x]=z;
    29     }
    30     for(int i=1;i<=n;i++)
    31     {
    32         if(map[1][i])
    33         minn[i]=map[1][i];
    34     }
    35     minn[1]=0;
    36     vis[1]=1;
    37     int now=1;
    38     for(int i=2;i<=n;i++)
    39     {
    40         int k=0;
    41         for(int j=2;j<=n;j++)
    42         {
    43             if(vis[j]==0&&minn[j]<minn[k])
    44             {
    45                 k=j;
    46             }
    47         }
    48         vis[k]=1;
    49         //printf("%d %d
    ",now,k);
    50         now=k;
    51         for(int j=2;j<=n;j++)
    52         {
    53             if(vis[j]==0&&map[k][j]<minn[j])
    54             {
    55                 minn[j]=map[k][j];
    56             }
    57         }
    58     }
    59     int tot=0;
    60     for(int i=1;i<=n;i++)
    61     tot=tot+minn[i];
    62     printf("%d
    ",tot);
    63     for(int i=1;i<=n;i++)
    64     {
    65         for(int j=1;j<=n;j++)
    66         {
    67             if(map[i][j]==minn[i]&&vis2[i][j]==0&&i!=j)
    68             {
    69                 vis2[i][j]=1;
    70                 vis2[j][i]=1;
    71                 printf("%d %d
    ",j,i);
    72             }
    73         }
    74     }
    75     return 0;
    76 }
  • 相关阅读:
    【BZOJ3052】[wc2013]糖果公园 带修改的树上莫队
    【BZOJ4668】冷战 并查集
    HCNP学习笔记之史上最全华为路由器交换机配置命令大合集
    前端学习笔记之css清除浮动float的七种常用方法总结和兼容性处理
    前端学习笔记之CSS浮动浅析
    前端学习笔记之CSS文档流
    前端学习笔记之HTML/CSS 速写神器 Emmet
    js 基本类型与引用类型的存储
    Javascript何时执行
    Number使用笔记
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/6704136.html
Copyright © 2020-2023  润新知