poj 3522 二分+判图连通(最小Slim生成树)

《算法导论》笔记(15) 最小生成树 部分习题 习题23.1-11 给定图G和一棵最小生成树T,假设减少了位于T之外的某条边的权重。因为T内的边,是连接所有结点的权重最小的,那么首先将T外的减少权重的边(u, v)加入T,然后在u, v中寻找所有的路径,去掉路径中权重最大的边。 习题23.2-3 使用斐波那契堆实现的Prim算法与使用二叉堆比较。因为斐波那契堆实现优先队列,使Prim算法的运行时间为O(E+VlgV),而二叉堆实现优先队列的P 阅读详情

题意:首先定义Slim为一个带权树中最大权减去最小权的值。给定一个无向图,如果它存在生成树,求其所有生成树中得最小Slim值。

思路:我自己的思路是:二分Slim值。对于每次选定的Slim值,枚举所有可能的生成树。方法为首先将边权值排序,然后设定两个游标i和j,i从0开始向右扫,相应的j为使得w[j]-w[i]<=Slim的最大值,由边权落在这个范围内的边构成图,看其是否连通(因为连通必有生成树);根据当前Slim值能否构成生成树来相应改变二分区间。

看到另一个思路更好(http://blog.youkuaiyun.com/ascii991/article/details/7464816):只要枚举最小边即可。使用kruskal的贪心法,得到的生成树的最大边必定最小(回忆最大瓶颈树的相应性质),所以最大边与最小边之差最小。

思路1:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 105
int g[N][N],first[N],used[N],w[N*N];
struct edge{
    int y,w,next;
}e[N*N*2];
int n,m,top;
int cmp(const void *a,const void *b){
    return (*(int *)a) - (*(int *)b);
}
void add(int x,int y,int w){
    e[top].y = y;
    e[top].w = w;
    e[top].next = first[x];
    first[x] = top++;
}
void create(int x,int y){
    int i,j;
    memset(first,-1,sizeof(first));
    top = 0;
    for(i = 1;i<n;i++)
        for(j = i+1;j<=n;j++)
            if(g[i][j]>=x && g[i][j]<=y)
                add(i,j,g[i][j]),
                add(j,i,g[i][j]);
}
void dfs(int x){
    int i;
    used[x] = 1;
    for(i = first[x];i!=-1;i=e[i].next)
        if(!used[e[i].y])
            dfs(e[i].y);
}
int connection(){
    int i,res=0;
    memset(used,0,sizeof(used));
    dfs(1);
    for(i = 1;i<=n;i++)
        res += used[i];
    return res==n;
}
int main(){
    while(scanf("%d %d",&n,&m) && (n+m)){
        int i,j,a,b,c,high,low,mid,flag;
        memset(g, 0, sizeof(g));
        for(i = 0;i<m;i++){
            scanf("%d %d %d",&a,&b,&c);
            g[a][b] = g[b][a] = c;
            w[i] = c;
        }
        qsort(w,m,sizeof(int),cmp);
        create(w[0],w[m-1]);
        if(!connection()){//如果全图都不连通,那么必然没有生成树;否则必存在生成树
            printf("-1\n");
            continue;
        }
        low = 0,high = 10000;
        while(low < high){
            mid = (low+high)>>1;
            flag = 0;
            for(i = j = 0;j<m&&i<=m-n+1;i++){
                while(j<m && w[j]-w[i] <= mid)
                    j++;
                create(w[i],w[j-1]);
                if(connection()){
                    flag = 1;
                    break;
                }
            }
            if(flag)
                high = mid;
            else
                low = mid+1;
        }
        printf("%d\n",low);
    }
    return 0;
}

思路2:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define clc(s,t) memset(s,t,sizeof(s))
#define N 105
#define INF 0x3fffffff
struct edge{
    int x,y,w;
}e[N*N];
int n,m,top,fa[N];
int cmp(edge a,edge b){
    return a.w<b.w;
}
int find(int x){
    if(fa[x] == x)
        return x;
    return fa[x] = find(fa[x]);
}
int kruskal(int s){
    int i,j,a,b,low,high;
    for(i = 1;i<=n;i++)
        fa[i] = i;
    low = e[s].w;
    for(i = 1,j=s;i<n && j<m;j++){
            a = find(e[j].x);
            b = find(e[j].y);
            if(a!=b){
                fa[a] = b;
                high = e[j].w;
                i++;
            }
    }
    if(i==n)
        return high-low;
    return -1;
}
int main(){
    while(scanf("%d %d",&n,&m) && (n+m)){
        int i,j,k,res=INF;
        for(i = 0;i<m;i++)
            scanf("%d %d %d",&e[i].x,&e[i].y,&e[i].w);
        sort(e,e+m,cmp);
        for(i = j = 0;i<m;i++){
            if(e[i].w == j)
                continue;
            j = e[i].w;
            k = kruskal(i);
            if(k == -1)
                break;
            else
                res = min(res,k);
        }
        if(res==INF)
            printf("%d\n",-1);
        else
            printf("%d\n",res);
    }
    return 0;
}


统信UOS系统盘扩容保姆级教程:用GParten-分区编辑器5分钟搞定 本文提供统信UOS系统盘扩容的详细图形化教程。针对系统盘空间不足问题,重点介绍如何使用系统自带的GParten-分区编辑器,在5-10分钟内安全、直观地完成扩容操作,无需记忆复杂命令,适合所有用户快速解决存储空间告急的困扰。 阅读详情

相关推荐

Hopf振荡器在机器人步态控制里到底怎么用?一个CPG仿生案例说清楚

本文深入解析了Hopf振荡器在机器人步态控制中的实际应用,通过CPG仿生案例详细展示了从数学方程到关节指令的完整流程。重点探讨了Hopf振荡器的极限环稳定性、参数调节技巧及自适应控制策略,为机器人运动控制提供了高效解决方案。

weixin_29284657的博客 202

poj3522Slim Span(最小生成树性质)

题目链接 Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7870   Accepted: 4191 Description Given an undirected weighted graph G, you sho

fouzhe的博客 1475

Wiley:International Journal for Numerical Methods in Biomedical Engineering投稿流程

中间过程省略,这个出版社很人性化,投稿的web UI也很好看。上传word之后,一步步跟着走就行,不用填太多东西。不要最后在最后检查阶段,重新上传word文件,这样会导致,之前针对word的操作全部改变。

Everyday try to become better -Kobe Bryant 2545

POJ 2395 Out of Hay(求最小生成树的最长边+kruskal)

Out of Hay Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18472   Accepted: 7318 Description The cows have run out of hay, a horrible event that must be remedied immedi...

蔡军帅 454

【笔记软件obsidian】从入门到精通

目录 一、前言 二、下载及安装 三、【选修】ios用户如何通过iCloud进行三平台同步 四、基本Markdown语法 五、【选修】插件的下载及安装方式 六、

patrick的博客 9万+

航空大数据——项目资源汇总及开源(四)

ADS-B项目开源大礼包

cyc头发还挺多的博客 4983

二分图大合集——二分图最大匹配(最小覆盖数),完美匹配以及最优匹配(带权最大匹配)

二分图: 定义:二分图又称作二部图,是图论的一种特殊模型。设G=(V, E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A , B),且图中的每条边(i, j)所关联的两个定点分别属于这两个不同的顶点集(i in A, j in B),则称图G为一个二分图。 简单的说,一个图被分成了两部分,相同的部分没有边,那这个图就是二分图,二分图是特殊的图。(不含奇环) 由定义可知,二分图没有自...

ling_wang的博客 5万+

SAP FICO会计凭证过账接口

-------------------------------------增加职能范围-ZHANGZG-2022.09.07 注释掉-2022.09.20。CONCATENATE '总账' ls_doc_item-hkont '要求输入成本对象值!*-------------------------------------增加职能范围-ZHANGZG-2022.09.07。*-------------------------------------增加职能范围-ZHANGZG-2022.09.07。

dingqing86的专栏 1079

POJ2485 求最小生成树的最大边长度

此题关键要理解输出的定义 For each test case, you should output a line contains an integer, which is the length of the longest road to be built such that all the villages are connected, and this value is minimu...

Coding for Dreams 645

[VT虚拟化驱动]安装DPC回调检测CPU对VT的支持

文章目录前言一、驱动基本框架二、安装DPC回调三、检测CPU对VT的支持本章代码def.h:DriverEntry.cpputil.cpp 前言 对于VT的介绍网上有很多详细的介绍,这里不再赘述,只需要知道它有比操作系统还高的权限,可以利用这一点进行某些操作,如内存隐藏, 无痕HOOK ,MSR HOOK, 调试或者反调试, 这里直奔主题 一、驱动基本框架 虚拟机设置里虚拟化引擎设置: 新建一个空的WDM工程,平台设置为x64平台,右键属性——>Inf2Cat——>Run Inf2Cat设置

吾无法无天的博客 3908

最小二乘(MLS)求点云法向量

MLS算法的基本思想是通过在点云的局部邻域内拟合一个光滑曲面,如平面或多项式曲面,以此来重建和处理点云数据。对于法向量估计,MLS通常在每个点的邻域内拟合局部平面,然后从该平面的法向量作为点的法向量。

twnkie的博客 744

poj3522——Slim Span

题目大意:给出n个点m条边,选出n-1条边,使得图连通且最大边与最小边的权值差最小。 分析:最小生成树。原题=>边从小到大排序后,枚举前m-n+1条边作为Krustal求最小生成树的最小边。因为krustal算法需要找出n-1条边,所以只有前m-(n-1)条可以作为每次krustal的最小边。 代码: #include <iostream> #include <algorithm> using namespace std; struct Edge{ int

tzyshiwolaogongya的博客 340

【x265编码器】章节1——x265的lookahead模块分析

目录一、模块功能二、lookahead模块分析1.调用流程2.代码分析Lookahead::addPicture()Lookahead::checkLookaheadQueue()Lookahead::getDecidedPicture()Lookahead::findJob()Lookahead::slicetypeDecide()PreLookaheadGroup::processTasksLookaheadTLD::lowresIntraEstimate()Lookahead::slicetypeAn

vcvdv123的博客 4万+

POJ 3522 - Slim Span

在所有生成树里,找到“最大边权值 减去 最小边权值”最小的那棵生成树。 那么,对于已经某个确定的最小边的所有生成树,我们找到最小生成树,它的“最大边权值 减去 最小边权值”就是这些生成树里最小的。 然后,我们枚举最小边即可。 #include #include #include using namespace std; #define N 102 #define M 5000 #define

Dilthey's Blog 533

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

poj3522 Slim Span

kruskal

YHaX的博客 359

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

poj3522Slim Span(暴力+Kruskal)

思路: 最小生成树是瓶颈生成树,瓶颈生成树满足最大边最小。 数据量较小,所以只需要通过Kruskal,将边按权值从小到大排序,枚举最小边求最小生成树,时间复杂度为O( nm(logm) ) #include <iostream> #include <cstring> #include <cstdio> #include <algorit...

weixin_33744854的博客 173

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

uva 1395 - Slim Span poj 3522 Slim Span(最小生成树算法)

最近学习了一下 最小生成树 算法。 所谓最小生成树算法,就是给出一个连通图g[ maxn ][ maxn  ], 找出这个连通图的边权和最小的生成图(树)。 可以实现这个目的的算法,我叫它最小生成树算法。kruskal算法就是我学到的一种实现这种功能的算法。 对于kruskal算法的描述以及简单的证明在刘汝佳第二版上已经说得够明白 本题就是求 最小生成树 里面的 最大边权和最小边权 相差最

GejinZ 971

POJ 3522 Slim Span

题意:就是求一个生成树,最大边-最小边 最小。这道题挺简单的,居然没几个人做。 解: 先对边排序,枚举枚举从哪条边开始,求最小生成树,如果有n-1条边构成生成树

swust_lian的博客 475

Slim Span POJ - 3522 最小生成树最大边和最小边之差最小

最小生成树最大边和最小边之差最小题意: 求最小生成树最大边和最小边的最小差值思路 用kruskal 算法,枚举最小边即可代码/* * Author : Echo * Email : 1666424499@qq.com * Description : * Created Time : 2017/10/10 19:25:26 * Last Mod

yanga11ang的博客 653

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

  Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5412   Accepted: 2842 Description Given an undirected weighted graph G, you should find one of sp...

jackgege的专栏 196

POJ 3522 Slim Span

题意: 求最大边与最小边差值最小的生成树,若不存在生成树则输出-1。 思路: 用Kruskal算法枚举最小边即可 1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 const int N = 110, M = 5000; 5...

weixin_34138377的博客 67

POJ 3522 Slim Span (并查集 + 枚举 + kruskal)

链接:点击打开链接 题目好长, 而且还有图片,所以就不复制粘贴过来了,这道题的大意是: 一棵树T(连通无环子图)将用n-1条边连接原图的所有的n个顶点,生成的生成树的最大权值边与最小权值边的差(称“苗条值”)尽量小,找出这个最小的苗条值; 思路: 用kruskal枚举; 首先对每条边的权值从小到大进行排序; 枚举每条边为最小边生成最小生成树,并计算这样的生成树的苗条值,枚举玩所

Epic丶玖遇 1203

POJ 3522 Slim Span

题意:告诉你n个点,m条边,问你他们的生成树中最长边与最短边的差值的最小值是多少,如果图不联通输出-1. 思路:Kruskal算法,枚举起始边,对于每一次kruskal算法,最后一条边必然是最长边,直接返回跟起始边的差值。 #include <cstdio> #include <iostream> #include <algorithm> #i...

weixin_34151004的博客 84

SLAM回环检测原理与工程实践:从词袋模型到ORB-SLAM应用解析

SLAM(即时定位与建图)是机器人自主导航的核心技术,其中回环检测用于识别机器人是否回到历史访问过的位置,是消除累积漂移、构建全局一致地图的关键环节。本文从回环检测的基本概念出发,阐述其与前端里程计和后端优化的关系,剖析词袋模型(BoW)的原理,包括离线字典构建、TF-IDF加权和相似度打分,并讲解几何验证与时间一致性校验等工程实现细节。同时结合实际部署经验,分析误检、漏检的成因及调参策略,介绍准确率、召回率与PR曲线等评测方法。无论你在使用ORB-SLAM还是其他视觉/激光SLAM系统,理解回环检测的底层

weixin_33850015的博客 400

【POJ 3522】Slim Span(生成树+暴力枚举)

Slim Span Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 9841 Accepted: 5196 Description Given an undirected weighted graph G, you should find one of spanning trees specified ...

duanghaha的博客 252

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

weixin_30405421的博客 92
上一篇: poj 2774 后缀数组(最长连续子串)
下一篇: poj 2060 最大匹配(最少出租出满足所有顾客)
dumeichen
博客等级 码龄13年 55粉丝 475原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值