2455 繁忙的都市

2455 繁忙的都市

2005年省队选拔赛四川

时间限制: 1 s
空间限制: 128000 KB
题目等级 : 大师 Master
 
 
 
 
题目描述 Description

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

1.  改造的那些道路能够把所有的交叉路口直接或间接的连通起来。

2.  在满足要求1的情况下,改造的道路尽量少。

3.  在满足要求1、2的情况下,改造的那些道路中分值最大的道路分值尽量小。

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

输入描述 Input Description

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

输出描述 Output Description

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

样例输入 Sample Input
4 5
1 2 3
1 4 5

  2 4 7

2 3 6
3 4 8
样例输出 Sample Output
3 6
数据范围及提示 Data Size & Hint

见题面

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 struct node{
 8     int x,y,v;
 9 }a[10000];
10 int n,m;
11 int fa[10000];
12 int cmp(node a,node b)
13 {
14     return a.v<b.v;
15 }
16 int find(int x)
17 {
18     if(fa[x]!=x)
19      {
20          fa[x]=find(fa[x]);
21          return fa[x];
22      }
23      else 
24      {
25          return x;
26      }
27 }
28 int main()
29 {
30     cin>>n>>m;
31     for(int i=1;i<=m;i++)
32      {
33          int x,y,v;
34          cin>>x>>y>>v;
35          a[i].x=x;
36          a[i].y=y;
37          a[i].v=v;
38      }
39      for(int i=1;i<=n;i++)
40       {
41           fa[i]=i;
42       }
43       int ans=0;
44       sort(a+1,a+m+1,cmp);
45       for(int i=1;i<=m;i++)
46        {
47            int r=find(a[i].x);
48            int rr=find(a[i].y);
49            if(r!=rr)
50             {
51                 fa[r]=rr;
52                 ans=max(a[i].v,ans);
53          }    
54        }
55        cout<<n-1<<" "<<ans;
56        return 0;
57 }

 

posted @ 2017-04-13 21:03  ioioioioioio  阅读(85)  评论(0编辑  收藏  举报