程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 2455 繁忙的都市,2455繁忙都市

2455 繁忙的都市,2455繁忙都市

編輯:C++入門知識

2455 繁忙的都市,2455繁忙都市


題目描述 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

見題面

分類標簽 Tags 點此展開、

直接上Kruskal暴力

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 struct node
 7 {
 8     int u;
 9     int v;
10     int w;
11 }edge[1000001];
12 int num=1;
13 int f[1000001];
14 int find(int x)
15 {
16     if(x!=f[x])
17     f[x]=find(f[x]);
18     return f[x];
19 }
20 void unionn(int x,int y)
21 {
22     int fx=find(x);
23     int fy=find(y);
24     f[fx]=fy;
25 }
26 int cmp(const node &a,const node &b)
27 {
28     return a.w<b.w;
29 }
30 int main()
31 {
32     int n,m;
33     scanf("%d%d",&n,&m);
34     for(int i=1;i<=n;i++)f[i]=i;
35     for(int i=1;i<=m;i++)
36     {
37         int x,y,z;
38         scanf("%d%d%d",&x,&y,&z);
39         edge[num].u=x;
40         edge[num].v=y;
41         edge[num].w=z;
42         num++;
43     }
44     sort(edge+1,edge+num,cmp);
45     int k=0;
46     int maxn=-1;
47     for(int i=1;i<=m;i++)
48     {
49         if(find(edge[i].u)!=find(edge[i].v))
50         {
51             if(edge[i].w>maxn)
52             maxn=edge[i].w;
53             k++;
54             unionn(edge[i].u,edge[i].v);
55         }
56         if(k==n-1)break;
57     }
58     printf("%d %d",n-1,maxn);
59     return 0;
60 }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved