首页 > 代码库 > Sicily 1504:Slim Span(最小生成树)

Sicily 1504:Slim Span(最小生成树)

技术分享

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 struct Vertex{
 5     int start, end;
 6     int weight;
 7 };
 8 Vertex arr[10000];
 9 int par[10000];
10 int n, m;
11 int find(int n){
12     while(par[n] != n){
13         n = par[n];
14     }
15     return n;
16 }
17 void merge(int n1, int n2){
18     while(par[n1] != n1){
19         n1 = par[n1];
20         par[n1] = n2;
21     }
22     par[n1] = n2;
23 }
24 bool cmp(Vertex v1, Vertex v2){
25     return v1.weight < v2.weight;
26 }
27 
28 void init(){                       
29     for(int i = 0; i <= n; i++)par[i] = i;
30 }
31 
32 long long func(int k){
33     init();
34     int weight_max = 0;
35     int i = 0;
36     bool fail = false;
37     int kk = k;
38     while(i < n-1){
39         if(k >= m){
40             fail = true;
41             break;
42         }
43         Vertex tmp = arr[k++];
44         int n1 = find(tmp.start);
45         int n2 = find(tmp.end);
46         if(n1 == n2){
47             continue;
48         }
49         else{
50             if(i == n-2){
51                 weight_max = tmp.weight;
52             }
53             if(n1 > n2)swap(n1, n2);
54             merge(n2, n1);
55             i++;
56         }
57     }
58     
59     if(fail) return -1;
60     else return weight_max - arr[kk].weight;
61 }
62 
63 int main(){
64     while(scanf("%d%d", &n, &m) != EOF && (n != 0 || m != 0)){
65         init();
66         for(int i = 0; i < m; i++){
67             scanf("%d%d%d", &arr[i].start, &arr[i].end, &arr[i].weight);
68         }
69         int MIN = 100000000;
70         sort(arr, arr+m, cmp);
71         for(int i = 0; i < m; i++){
72             int tmp = func(i);
73             if(tmp != -1)MIN = min(MIN, tmp);
74         }
75         if(MIN == 100000000){
76             printf("-1\n");
77         }
78         else{
79             printf("%d\n", MIN);
80         }
81     }
82 } 

 

Sicily 1504:Slim Span(最小生成树)