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 } 
时间: 2024-12-26 10:04:58

Sicily 1504:Slim Span(最小生成树)的相关文章

POJ 3522 Slim Span 最小生成树,暴力 难度:0

kruskal思想,排序后暴力枚举从任意边开始能够组成的最小生成树 #include <cstdio> #include <algorithm> using namespace std; const int maxn = 101; const int maxe = maxn * maxn / 2; struct edge{ int f,t,c; bool operator <(edge e2)const { return c<e2.c; } }e[maxe]; int

POJ 3522 Slim Span(最小生成树)

题意:给定一个n个点m条边的无向图,找一颗苗条度(最大边减最小边)最小的生成树. 思路:假设苗条度最小的这棵树的最小边为a,若要使苗条度最小,答案一定是以a为最小边的一颗最小生成树,所以可以考虑枚举最小边,计算出苗条度并更新答案. #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm

uva1395 - Slim Span(最小生成树)

先判断是不是连通图,不是就输出-1. 否则,把边排序,从最小的边开始枚举最小生成树里的最短边,对每个最短边用Kruskal算法找出最大边. 或者也可以不先判断连通图,而是在枚举之后如果ans还是INF,说明就没有,就输出-1. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath>

UVA 1395 Slim Span (最小生成树,MST,kruscal)

题意:给一个图,找一棵生成树,其满足:最大权-最小权=最小.简单图,不一定连通,权值可能全相同. 思路:点数量不大.根据kruscal每次挑选的是最小权值的边,那么苗条度一定也是最小.但是生成树有多棵,苗条度自然也有多个,穷举下所有生成树,就知道了结果了.根据“只要起始边不同,生成树必定不同”来穷举起始边. 又发现一可能的坑!!我以为LONG_MAX就是int的正最大值,也就是2147483647=2^31-1,在我的机器上也许如此,在OJ上不一定了,用LONG_MAX转int会不同,得注意.

POJ 3522 ——Slim Span——————【最小生成树、最大边与最小边最小】

Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7102   Accepted: 3761 Description Given an undirected weighted graph G, you should find one of spanning trees specified as follows. The graph G is an ordered pair (V, E), where V 

POJ 3522 Slim Span【枚举+克鲁斯卡尔求最小生成树】

Slim Span Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7365 Accepted: 3909 Description Given an undirected weighted graph G, you should find one of spanning trees specified as follows. The graph G is an ordered pair (V, E), where V is a

POJ-3522 Slim Span(最小生成树)

Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 8633   Accepted: 4608 Description Given an undirected weighted graph G, you should find one of spanning trees specified as follows. The graph G is an ordered pair (V, E), where V 

[2016-01-27][UVA][1395][D -?Slim Span]

[2016-01-27][UVA][1395][D - Slim Span] 时间:2016-01-21  11:06:30  星期四 题目编号:UVA 1395 题目大意:求所有生成树 最大边和最小边之差的最小值 分析: 想法是枚举所有边,但是分析之后发现可以不用枚举所有的树 已知krukal得到的最小生成树得到的最小生成树,最大边最小 也就是说,这个最大边,就是使得 最大边和最小边 差值最大的边 那么,只需要求每条边的对应的差值最小的最大边即可 方法: 从最小的边开始跑生成树,然后跑krus

POJ3522 Slim Span

Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7462   Accepted: 3959 Description Given an undirected weighted graph G, you should find one of spanning trees specified as follows. The graph G is an ordered pair (V, E), where V 

UVA 1395 - Slim Span(MST)

UVA 1395 - Slim Span 题目链接 题意:给定一些结点和边,要求出最苗条度最小的生成树,苗条度定义为:生成树中最大权的边减去最小权的边的值 思路:类似建最小生成树的算法,多一步枚举起始边即可 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 105; const int INF = 0x3f3f3f3f; int