zoukankan      html  css  js  c++  java
  • P2330 [SCOI2005]繁忙的都市【MST】

    题目描述

    城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造。城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道路相连接。这些道路是双向的,且把所有的交叉路口直接或间接的连接起来了。每条道路都有一个分值,分值越小表示这个道路越繁忙,越需要进行改造。但是市政府的资金有限,市长希望进行改造的道路越少越好,于是他提出下面的要求:

    1.改造的那些道路能够把所有的交叉路口直接或间接的连通起来。 2.在满足要求1的情况下,改造的道路尽量少。 3.在满足要求1、2的情况下,改造的那些道路中分值最大的道路分值尽量小。

    任务:作为市规划局的你,应当作出最佳的决策,选择那些道路应当被修建。

    输入格式

    第一行有两个整数n,m表示城市有n个交叉路口,m条道路。

    接下来m行是对每条道路的描述,u, v, c表示交叉路口u和v之间有道路相连,分值为c。(1≤n≤300,1≤c≤10000,1≤m≤100000)

    输出格式

    两个整数s, max,表示你选出了几条道路,分值最大的那条道路的分值是多少。

    输入输出样例

    输入 #1
    4 5
    1 2 3
    1 4 5
    2 4 7
    2 3 6
    3 4 8
    
    输出 #1
    3 6

    思路
      黄题难度, 建图跑kruskal, 最小道路数一定是十字路口数-1, 维护树上最大边权值即可

    CODE
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 
     6 using namespace std;
     7 const int maxn = 1e3+7;
     8 
     9 ///把所有边排序,记第i小的边为:e[i](1 <= i < m)
    10 ///初始化MST为空
    11 ///初始化连通分量,让每个点自成一个独立的连通分量
    12 ///for(int i = 0; i < m; i++) {
    13 ///   if(e[i].u 和 e[i].v 不在同一个连通分量) {
    14 ///     把边e[i]加入MST
    15 ///     合并e[i].u 和 e[i].v 所在的连通分量
    16 ///   }
    17 ///}
    18 
    19 int fa[5050],n,m,ans,eu,ev,cnt;
    20 
    21 struct node{
    22     int u, v, w;
    23 }e[1000007];
    24 
    25 int a[maxn][maxn];
    26 
    27 bool cmp(node a, node b)
    28 {
    29     return a.w < b.w;
    30 }
    31 
    32 int fid(int x)
    33 {
    34     return x == fa[x] ? x : fa[x] = fid(fa[x]);
    35 }
    36 
    37 void init(int n)
    38 {
    39     for(int i = 1; i <= n; i++) {
    40         fa[i] = i;
    41     }
    42     ans = 0;
    43     cnt = 0;
    44 }
    45 
    46 bool unite(int r1, int r2)///冰茶鸡
    47 {
    48     int fidroot1 = fid(r1), fidroot2 = fid(r2);
    49     if(fidroot1 != fidroot2) {
    50         fa[fidroot2] = fidroot1;
    51         return true;
    52     }
    53     return false;
    54 }
    55 
    56 void kruskal(int m)
    57 {
    58     sort(e+1, e+m+1, cmp);
    59     for(int i = 1; i <= m; i++) {
    60         eu = fid(e[i].u);
    61         ev = fid(e[i].v);
    62         if(eu == ev) {
    63             continue;
    64         }
    65         ans = max(ans, e[i].w);
    66         fa[ev] = eu;
    67         if(++cnt == n-1) {
    68             break;
    69         }
    70     }
    71 }
    72 
    73 int main()
    74 {
    75     scanf("%d %d",&n, &m);
    76     init(n);
    77     for ( int i = 1; i <= m; ++i ) {
    78         scanf("%d %d %d",&e[i].u, &e[i].v, &e[i].w);
    79     }
    80     kruskal(m);
    81     printf("%d %d
    ",n-1, ans);
    82     return 0;
    83 }
    View Code
  • 相关阅读:
    OSG-提示“error reading file e:1.jpg file not handled”
    OSG-加载地球文件报0x00000005错误,提示error reading file simple.earth file not handled
    QT-找开工程后,最上方提示the code model could not parse an included file, which might lead to incorrect code completion and highlighting, for example.
    我的书《Unity3D动作游戏开发实战》出版了
    java中无符号类型的第三方库jOOU
    Windows批处理备份mysql数据
    使用 DevTools 时,通用Mapper经常会出现 class x.x.A cannot be cast to x.x.A
    Java版本,Java版本MongoDB驱动,驱动与MongoDB数据库,Spring之间的兼容性
    Jrebel本地激活方法
    wget下载指定网站目录下的所有内容
  • 原文地址:https://www.cnblogs.com/orangeko/p/12389148.html
Copyright © 2011-2022 走看看