UVA1395

// UVa1395 Slim Span
// Rujia Liu
#include<cstdio>
#include<cmath>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;

const int maxn = 100 + 10;
const int INF = 1000000000;
int n;

int pa[maxn];
int findset(int x) { return pa[x] != x ? pa[x] = findset(pa[x]) : x; } 

struct Edge {
  int u, v, d;
  Edge(int u, int v, int d):u(u),v(v),d(d) {}
  bool operator < (const Edge& rhs) const {
    return d < rhs.d;
  }
};

vector<Edge> e;

int solve() {
  int m = e.size();
  sort(e.begin(), e.end());
  int ans = INF;
  for(int L = 0; L < m; L++) {  //枚举从第L条边开始kruskal
    for(int i = 1; i <= n; i++) pa[i] = i;
    int cnt = n; // number of sets
    for(int R = L; R < m; R++) {  //枚举终点,遇到终止条件break
      int u = findset(e[R].u), v = findset(e[R].v);
      if(u != v) {
        pa[u] = v;
        if(--cnt == 1) { ans = min(ans, e[R].d-e[L].d); break; }  //计算“苗条度”
      }
    }
  }
  if(ans == INF) ans = -1;
  return ans;
}

int main() {
  int m, u, v, d;
  while(scanf("%d%d", &n, &m) == 2 && n) {
    e.clear();
    for(int i = 0; i < m; i++) {
      scanf("%d%d%d", &u, &v, &d);
      e.push_back(Edge(u, v, d));
    }
    printf("%d\n", solve());
  }
  return 0;
}
时间: 2024-10-26 22:43:52

UVA1395的相关文章

UVA1395 (最苗条的最小生成树)

链接 https://vjudge.net/problem/UVA-1395 代码 #include<bits/stdc++.h> using namespace std; #define ull unsigned long long #define ll long long const int maxn=5e4+10; int par[maxn]; int rank1[maxn]; void init(int n) //初始化 { for(int i=0;i<=n;i++) { par

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,.

UVA-1395 Slim Span

一道简单的图论题(并查集+Kruskal)求一个图的的生成树,要求最大边减最小边之差最小,输出权值之差,如果没有,输出-1要求权值差最小,所以首先将边按权值排序,枚举最小边,对于每个最小边从小到大枚举最大边用并查集判断是否连通,如果可以生成树更新ans 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<vector> 5 using namespace std; 6

UVA1395 Slim Span(枚举最小生成树)

题意: 求最小生成树中,最大的边减去最小的边 最小值. 看了题解发现真简单=_= 将每条边进行从小到大排序,然后从最小到大一次枚举最小生成树,当构成生成树的时候,更新最小值 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int INF = 0x3f3f3f3f; 7 con

uva1395 - Slim Span(最小生成树)

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

例题11-2 苗条的生成树 UVa1395

1.题目描述:点击打开链接 2.解题思路:本题实质上还是利用Kruskal算法来生成MST.首先按照边权值由小到大排序,对于一个连续的边集[L,R],如果使得这n个点全部连通,则一定存在一个苗条度不超过w[R]-w[L]的生成树.因此,可以从小到大枚举L,对于每一个L,利用Kruskal算法生成最小生成树后,计算苗条度,用ans取最小的即可.如果枚举结束后ans依然是INF.那么输出-1.这里可以加上一个预处理:如果m<n-1,那么直接输出-1. 3.代码: #define _CRT_SECUR

UVa1395图论之最小生成树

//除了套模版之外还有新的思想在其中:枚举. #include <iostream> #include <algorithm> #include <stdio.h> #include <math.h> #include <map> #include <set> #include <vector> #include <string> #include <cstring> #include <ss

UVa1395&amp;POJ3522--Slim Span【kruskal】瓶颈生成树

链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4141 题意:给出n个顶点,m条边,求一个生成树,使得最大边与最小边的差值最小. 思路:求一个生成树使最大边最小是瓶颈生成树.对于此题,我们枚举每一条边做最小边的情况,找对应的最小生成树的最大边,找出最大边与最小边差值最小的值即可. #include<cstring> #in

UVa1395 &amp;&amp; POJ 3522 Slim Span

UVa POJ Description 求苗条度最小的生成树 苗条度指该生成树的最大边 - 最小边 Algorithm Kruskal变形 先sort 然后枚举最小边 构建最小生成树 Hint UVa JAVA的RE 不知道为何= = POJ的JAVA才1.5 λ表达式是JAVA 1.8才有的 然后本人才疏学浅 除了λ表达式以外不会写自定义sort比较 所以CE = = C++就过了 会了C++ 的INF写法 #include <climits> 这样就有 INT_MAX这个常量了 Code