首页 > 代码库 > 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(最小生成树)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。