城市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 Input4 5
1 2 3
1 4 5
2 4 7
2 3 6
3 4 8樣例輸出 Sample Output
3 6數據范圍及提示 Data Size & Hint
見題面
直接上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 }