最大边和最小边之差最小的生成树 UVA 1394

题目大意:给你n个点的图,求苗条度(最大边减最小编)尽量小的生成树

思路:sort以后暴力枚举区间即可

//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
const int inf = 0x3f3f3f3f;
const int maxn = 100 + 5;
struct Edge{
    int u, v, val;
    Edge(int u = 0, int v = 0, int val = 0): u(u), v(v), val(val){}
    bool operator < (const Edge &a) const{
        return val < a.val;
    }
}edges[maxn * maxn];
int par[maxn];
int n, m;

void init(){for (int i = 1; i <= n; i++) par[i] = i;}
int pfind(int x){
    if (par[x] == x) return x;
    return par[x] = pfind(par[x]);
}

bool solve(int l, int r){
    for (int i = l; i <= r; i++){
        int pu = pfind(edges[i].u);
        int pv = pfind(edges[i].v);
        if (pu == pv) continue;
        par[pu] = pv;
    }
    int p = pfind(1);
    for (int i = 2; i <= n; i++){
        if (p != pfind(i)) return false;
    }
    return true;
}

int main(){
    while (scanf("%d%d", &n, &m) && n){
        for (int i = 1; i <= m; i++) {
            int u, v, val; scanf("%d%d%d", &u, &v, &val);
            edges[i] = Edge(u, v, val);
        }
        int ans = inf;
        sort(edges + 1, edges + m + 1);
        for (int l = 1; l <= m; l++){
            init();
            for (int r = l; r <= m; r++){
                if (solve(l, r)){
                    ans = min(ans, edges[r].val - edges[l].val);
                    break;
                }
            }
        }
        if (ans == inf) ans = -1;
        printf("%d\n", ans);
    }
    return 0;
}

时间: 2024-08-07 17:01:04

最大边和最小边之差最小的生成树 UVA 1394的相关文章

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

量数组交换差最小算法

交换两个数组值使两个数组之差最小 有两个序列a,b,大小都为n,序列元素的值任意整数,无序: 要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小. 例如: var a=[100,99,98,1,2, 3]; var b=[1, 2, 3, 4,5,40]; 假设序列a,b中元素的和为sum_a和sum_b.假设aa和bb分别为序列a,b中的元素,则交换aa,bb后序列的和变为sum_a-aa+bb,sum_b+aa-bb: 两序列的差为(sum_a-aa+b

hdu 2242 无向图/求用桥一分为二后使俩个bcc点权值和之差最小并输出 /缩点+2次新图dfs

题意如标题所述, 先无向图缩点,统计出每个bcc权,建新图,然后一遍dfs生成树,标记出每个点(新图)以及其子孙的权值之和.这样之后就可以dfs2来枚举边(原图的桥),更新最小即可. 调试了半天!原来是建老图时候链式前向星和新图的vector<vector< int>>俩种存图搞乱了!!!不可原谅!哎!愚蠢!愚不可及!提交后1A. 后来百度之后,发现说是用树形dp,看了代码解法,竟然和我的是一样的算法..原来这种算法可以叫树形dp...的确有点dp味道..不过感觉不太浓.. 以后多

[微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小_利用排列组合思路解决_python版

(原题出自微软公司面试题)问题如下:有两个序列a,b,大小都为n,序列元素的值任意整数,无序:要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小.例如:a=[100,99,98,1,2, 3]b=[1, 2, 3, 4,5,40] 题目是看到QQ群友发的,网上也百度了下目前已经有好几种解法了.写了半天有点晕,后面忽然想到中学时候数学里面的排列组合的方法.方法对于较短的list可行,长list组合情况太多,可能耗时太长或溢出. 1 from itertools im

通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小

题目描述: 有两个序列a,b,大小都为n,序列元素的值任意整数,无序:要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小.例如:var a=[100,99,98,1,2, 3];var b=[1, 2, 3, 4,5,40]; 分析: 很多情况下,贪心算法得到的解并不是最优解,但是这道题貌似是最优解 思想:每次从AB中找到两个使得和之差最小的元素交换 当前和之差diff=sumA-sumB,从A中找到一元素a,从B中找到一元素b,如果交换那么就须有(sumA

最大子序列和,最小子序列和,最小正子序列和,最大子序列乘积

来自:<数据结构与算法分析——C语言描述>练习2.12 一. 最大子序列和 1.穷举法,O(N3) 1 int maxSequenceSum1(const int A[], int N) 2 { 3 int i, j, k, maxSum, thisSum; 4 5 maxSum = 0; 6 for (i = 0; i < N; i++) 7 { 8 for (j = i; j < N; j++) 9 { 10 thisSum = 0; 11 for (k = i; k <

最小路径覆盖,最小点覆盖,最大独立点集(转)

来自:http://blog.csdn.net/l04205613/article/details/6278394 node  1:最小路径覆盖 在一个PXP的有向图中,路径覆盖就是在图中找一些路经,使之覆盖了图中的 所有顶点,且任何一个顶点有且只有一条路径与之关联:(如果把这些路径中的每条路径从它的起始点走到它的终点,那么恰好可以经过图中的每个顶点一次且仅一 次):如果不考虑图中存在回路,那么每条路径就是一个弱连通子集. 由上面可以得出: 1.一个单独的顶点是一条路径: 2.如果存在一路径p1

POJ2125 Destroying The Graph 二分图 + 最小点权覆盖 + 最小割

思路来源:http://blog.csdn.net/lenleaves/article/details/7873441 求最小点权覆盖,同样求一个最小割,但是要求出割去了那些边, 只要用最终的剩余网络进行一次遍历就可以了,比较简单. 建图:同样是一个二分图,左边的点代表去掉出边, 右边的点代表去掉入边(小心别弄混),左边去掉出边的点与源点相连, 容量为wi- . 然后更据给出的弧进行连线,权值为INF 使用很好理解的EK算法:(360MS) //#pragma comment(linker, "

最小路径覆盖和最小边覆盖及相关性质

[最小路径覆盖] 首先给出公式:DAG的最小路径覆盖数=DAG图中的节点数-相应二分图中的最大匹配数. 一个PXP的有向图中,路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联:(如果把这些路径中的每条路径从它的起始点走到它的终点,那么恰好可以经过图中的每个顶点一次且仅一次):如果不考虑图中存在回路,那么每条路径就是一个弱连通子集. 由上面可以得出: 1.一个单独的顶点是一条路径: 2.如果存在一路径p1,p2,......pk,其中p1 为起点,pk