题意:给你N个点M条边,求最小生成树,并且输出最小生成树里最大的那条边,并且输出路径
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 using namespace std; 7 8 #define N 1005 9 #define M 15005 10 int father[N],rank[N],n,m,sum,MAX,num; 11 int NUM[N]; 12 struct Edge 13 { 14 int u; 15 int v; 16 int w; 17 }edge[M]; 18 19 bool cmp(Edge a,Edge b) 20 { 21 return a.w < b.w ; 22 } 23 24 void Init() 25 { 26 for(int i=0; i<=n; i++) 27 { 28 father[i] = i; 29 rank[i] = 1; 30 } 31 } 32 33 int find(int x) 34 { 35 if(father[x] != x) 36 { 37 father[x] = find(father[x]); 38 } 39 return father[x] ; 40 } 41 42 void merge(int x,int y) 43 { 44 int xf = find(x); 45 int yf = find(y); 46 if(rank[xf] > rank[yf]) 47 { 48 rank[xf] += rank[yf]; 49 father[yf] = xf; 50 } 51 else 52 { 53 rank[yf] += rank[xf]; 54 father[xf] = yf; 55 } 56 } 57 58 void Kruskal() 59 { 60 num = 0; 61 MAX=0; 62 for(int i=0; i<m; i++) 63 { 64 int u = edge[i].u; 65 int v = edge[i].v; 66 if(find(u) != find(v)) 67 { 68 NUM[num] = i; 69 num++ ; 70 sum += edge[i].w; 71 MAX = max(MAX,edge[i].w); 72 merge(u,v); 73 } 74 if(num == n-1) break; 75 } 76 } 77 78 int main() 79 { 80 while(scanf("%d%d",&n,&m)!=EOF) 81 { 82 Init(); 83 for(int i=0; i<m; i++) 84 { 85 scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w); 86 } 87 sort(edge,edge+m,cmp); 88 sum = 0; 89 Kruskal(); 90 printf("%d ",MAX); 91 printf("%d ",num); 92 for(int i=0; i<num; i++) 93 { 94 printf("%d %d ",edge[NUM[i]].u,edge[NUM[i]].v); 95 } 96 } 97 return 0; 98 }