zoukankan      html  css  js  c++  java
  • 繁忙的都市

    繁忙的都市

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 71  解决: 52
    [提交][状态][讨论版]

    题目描述

    城市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)

    输出

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

    样例输入

    4 5
    1 2 3
    1 4 5
    2 4 7
    2 3 6
    3 4 8
    

    样例输出

    3 6
    题解:这道题只是对于最小生成树的一个更新罢了,最大的分值如果用kruskal算法就是最后一条加入的边。几条路的话就是n-1条,因为没有什么输出-1之类的所有应该是个连通图。
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<string>
     7 
     8 using namespace std;
     9 const int MAXN=10007;
    10 
    11 struct fzy
    12 {
    13     int u,v,zhi;
    14 }a[MAXN];
    15 int num,n,m;
    16 int f[307];
    17 
    18 void init()
    19 {
    20     num=0;
    21     for (int i=0;i<307;i++)
    22         f[i]=i;
    23 }
    24 bool cmp(fzy a,fzy b)
    25 {
    26     return a.zhi<b.zhi;
    27 }
    28 int find(int num)
    29 {
    30     if (f[num]!=num) f[num]=find(f[num]);
    31     return f[num];
    32 }
    33 int main()
    34 {
    35     init();
    36     
    37     int x,y,z;
    38     scanf("%d%d",&n,&m);
    39     for (int i=1;i<=m;i++)
    40     {
    41         scanf("%d%d%d",&x,&y,&z);
    42         a[++num].u=x;
    43         a[num].v=y;
    44         a[num].zhi=z;
    45     }
    46     sort(a+1,a+num+1,cmp);
    47     int number=1,ans=0;
    48     for (int i=1;i<=num;i++)
    49     {
    50         x=find(a[i].u),y=find(a[i].v);
    51         if (x!=y)
    52         {
    53             number++;
    54             ans=a[i].zhi;
    55             f[y]=x;
    56         }
    57         if (number==n) break;
    58     }    
    59     printf("%d %d",n-1,ans);
    60 }
    View Code
    
    
  • 相关阅读:
    51nod 1087 1 10 100 1000(找规律+递推+stl)
    51nod 1082 与7无关的数 (打表预处理)
    51 nod 1080 两个数的平方和
    1015 水仙花数(水题)
    51 nod 1003 阶乘后面0的数量
    51nod 1002 数塔取数问题
    51 nod 1001 数组中和等于K的数对
    51 nod 1081 子段求和
    51nod 1134 最长递增子序列 (O(nlogn)算法)
    51nod 1174 区间中最大的数(RMQ)
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/6941962.html
Copyright © 2011-2022 走看看