Slim Span UVA - 1395

题意:寻找满足条件的最小生成树,条件是生成树中最长边与最短边的差越小越好。

题解:将边进行排序后,枚举第一条边,然后不断更新答案就行了。

 1 #define INF 1e8
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7
 8 const int maxn=10005;
 9
10 struct edge{
11     int u,v,cost;
12     bool operator<(const edge& i)const{
13         return cost<i.cost;
14     }
15 }es[maxn];
16
17 int n,m,cnt;
18 int F[105];
19
20 void Init(){
21     for(int i=1;i<=n;i++) F[i]=i;
22     cnt=1;
23 }
24
25 int Find(int a){
26     if(a!=F[a]) F[a]=Find(F[a]);
27     return F[a];
28 }
29
30 bool unite(int a,int b){
31     int x=Find(a),y=Find(b);
32     if(x==y) return false;
33     else { F[x]=y; return true; }
34 }
35
36 int Kruskal(){
37     sort(es,es+m);
38     int ans=INF;
39     for(int i=0;i<m;i++){
40         Init();
41         unite(es[i].u,es[i].v);
42         for(int j=i+1;j<m;j++){
43             if(unite(es[j].u,es[j].v)){
44                 cnt++;
45                 if(cnt==n-1) ans=min(ans,es[j].cost-es[i].cost);
46             }
47         }
48     }
49     return ans;
50 }
51
52 int main()
53 {   while(~scanf("%d%d",&n,&m)){
54         if(n==0&&m==0) break;
55         for(int i=0;i<m;i++) scanf("%d%d%d",&es[i].u,&es[i].v,&es[i].cost);
56         int ans=Kruskal();
57         if(m==0||(n>2&&m==1)) cout<<"-1"<<endl;
58         else if(n==2&&m==1) cout<<"0"<<endl;
59         else if(ans==INF) cout<<"-1"<<endl;
60         else cout<<ans<<endl;
61     }
62     return 0;
63 }
时间: 2024-10-21 09:36:23

Slim Span UVA - 1395的相关文章

UVA1395 Slim Span(kruskal)

题目:Slim Span UVA 1395 题意:给出一副无向有权图,求生成树中最小的苗条度(最大权值减最小权值),如果不能生成树,就输出-1: 思路:将所有的边按权值有小到大排序,然后枚举每一条边,以这条边开始利用Kruskal算法生成树,生成过程中求出权值的最大值,这个最大值减去当前枚举的边的权值就是苗条度,再动态维护一下最小苗条度就可以了. #include <iostream> #include <algorithm> #include <queue> #inc

[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

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

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 

UVA1395 Slim Span(kruskal算法)

Slim Span [PDF Link] 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 set of vertices {v1, v2,..., vn} and E is a set of undirected edges {e1, e2,.

POJ 3522 Slim Span (Kruskal +枚举 边权差最小的生成树)

Slim Span Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 6685 Accepted: 3544 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

【Kruskal】Slim Span

[Uva1395]Slim Span 题目略…… 试题分析:codevs1001舒适的路线上加一个判一下连通性就好,顺便把除改成减 代码: #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; inline int read(){ int x=0,f=1;char c=getchar(); for(;!isdigit(c);

UVALive-3887 Slim Span (kruskal)

题目大意:定义无向图生成树的最大边与最小边的差为苗条度,找出苗条度最小的生成树的苗条度. 题目分析:先将所有边按权值从小到大排序,在连续区间[L,R]中的边如果能构成一棵生成树,那么这棵树一定有最小的苗条度.枚举所有这样的区间. 代码如下: # include<iostream> # include<cstdio> # include<set> # include<queue> # include<cstring> # include<al

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