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