hdu 2121 无固定根的最小树形图

最小树形图入门总结 求解最小树形图最小权值一般使用算法为朱刘算法. 原理入门推荐博客:https://blog.youkuaiyun.com/qq_34731703/article/details/53965684 ps:该博客使用模板为邻接矩阵实现,便于理解,但是在做题时邻接矩阵初始化耗时太多,我们需要改成前向星的存储方式. 关于模板: 用前向星实现的朱刘算法网上有许多模板,这里放个我觉得比较优秀的模板:https://... 阅读详情
题目链接

解析


本题为不是固定根的最小树形图,我们可以虚拟出一根来,然后在把这个根跟每个点相连,相连的点可以设为无穷大,或者设为所有边和大一点,比如为r,然后就可以利用最小树形图进行计算了,计算出的结果减去r,如果比r还大就可以认为通过这个虚拟节点我们连过原图中两个点,即原图是不连通的,我们就可以认为不存在最小树形图。关于输出最小根也挺简单,在找最小入弧时,如果这条弧的起点是虚拟根,那么这条弧的终点就是要求的根。 但是我们根据最小入边的性质,可知,如果没缩点,必然找不到那个根,因为虚拟根连的边都非常大。但是缩点后,找到的必然是最小的那个序号的根。


代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn = 1000+100;
typedef long long LL;
int deg[maxn];
struct node {
    int u, v;
    LL w;
    node ()
    {}
    node (int _u, int _v, int _w) {
        u = _u;
        v = _v;
        w = _w;
    }
}edge[maxn*maxn], p[100000+10];
LL in[maxn];
int vis[maxn], id[maxn], pre[maxn];
int pos;
LL Directed_MST(int root, int n, int m, node e[]) {
    LL ret = 0;
    while (1) {
        //第一步:找到入边最小边
        for (int i=0; i<n; i++)
            in[i] = INF;
        for (int i=0; i<m; i++) {
            int u = e[i].u, v = e[i].v;
            if (e[i].w < in[v] && u != v) {
                in[v] = e[i].w;
                pre[v] = u;
                if (u == root)  //找到与源点相连的点就是树形图的根 
                    pos = i;
            }
        }

        for (int i=0; i<n; i++) { //没有入边,就不会产生最小树形图
            if (i == root)
                continue;
            if (in[i] == INF)
                return -1;
        }
        int cntnode = 0;
        memset(id, -1, sizeof(id));
        memset(vis, -1, sizeof(vis));
        // 第二步:找环
        in[root] = 0;
        for (int i=0; i<n; i++) {
            ret += in[i];
            int v = i;
            while (vis[v] != i && id[v] == -1 && v != root) {
                vis[v] = i;
                v = pre[v];
            }
            if (v != root && id[v] == -1) {
                for (int u=pre[v]; u!=v; u=pre[u])
                    id[u] = cntnode;
                id[v] = cntnode++;
            }
        }
        if (cntnode  == 0)
            break;

        for (int i=0; i<n; i++) {
            if (id[i] == -1)
                id[i] = cntnode++;
        }

        //第三步:缩点、重新标记
        for (int i=0; i<m; i++) {
            int v = e[i].v;
            e[i].u = id[e[i].u];
            e[i].v = id[e[i].v];
            if (e[i].u != e[i].v)
                e[i].w -= in[v];
        }
        n = cntnode;
        root = id[root];
    }
    return ret;
}

int main() {
    int n, m;
    while (~scanf("%d%d", &n, &m)) {
        memset(deg, 0, sizeof(deg));
        memset(pre, 0, sizeof(pre));
        memset(id, -1, sizeof(id));
        memset(vis, -1, sizeof(vis));
        LL sum = 0;
        for (int i=0; i<m; i++) {
            int u, v;
            LL w;
            scanf("%d%d%lld", &u, &v, &w);
            edge[i] = node(u, v, w);
            sum  += w;
        }
        sum++;
        for (int i=m; i<n+m; i++) {
            edge[i] = node(n, i-m, sum);
        }
        LL ans = Directed_MST(n, n+1, n+m, edge);
        if (ans == -1 || ans-sum >= sum)
            puts("impossible");
        else
            printf("%lld %d\n", ans-sum, pos-m);
        printf("\n");
    }
    return 0;
}
蓝牙HCI Dongle实战:从芯片选型到协议栈集成的完整指南 本文详细介绍了蓝牙HCI Dongle的实战应用,从芯片选型到协议栈集成的完整指南。通过对比CSR8510、nRF52840等主流芯片的性能和价格,提供选型建议和避坑技巧。同时,深入解析Zephyr协议栈移植和常见问题排查,帮助开发者高效完成蓝牙项目开发。 阅读详情

相关推荐

渗透测试自学日志之漏洞复现篇:漏洞列表

复现成功的漏洞列表,有复现方式,各位可以参考。 网络安全,人人有责,使用本文进行非法活动,与本人无关

maverickpig的博客 2175

最小树形图

最小树形图:即有向图的最小生成树。最小树形图的第一个算法是1965年朱永津和刘振宏提出的复杂度为O(VE)的算法。有向图的最小生成树与无向图的最小生成树的区别:对于无向图,只要该图的最小生成树存在,那么无论以哪个点为根,一定可以找到其最小生成树;而对于有向图来说,可能从某一个顶点为根开始找最小生成树是存在的,而从另一个点为根来找却不能找到一个最小生成树。最小树形图问题的分类:一般分为两类,有定根的最

moonlight的博客 1594

从波形到代码:手把手调试GaN图腾柱PFC的过零点切换与软启动策略

本文详细解析了GaN图腾柱无桥Boost PFC电路在过零点切换与软启动策略中的调试方法。通过波形分析、代码实现和寄存器配置,提供了解决误开通、震荡波形等问题的实用方案,帮助工程师优化电源设计效率与可靠性。

weixin_30831529的博客 424

HDU 6141 最小树形图

题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=6141 题意: N个点M条边求最大树形图,还问权值最大的图中第N个点的父亲编号最小能是多少 规模:N<=1e3,M<=1e4N <= 1e3, M <= 1e4 类型:最小树形图 边权处理 分析: 最开始做的时候用最小费用流,但会超时 原来是最小树形图 这里第N个点的边权,按其u的序号

spring_3_shine的博客 598

C++总结笔记

/ ++操作 这是因为定义的数组,申请的是连续的内存空间,当ptr++(ptr是int类型的指针变量),地址空间向后偏移是以int类型的大小为单位进行偏移的,相当于int类型数组元素的向后偏移。使用场景:它是最通用的转换形式,用于将一种类型转换为另一种类型,例如基本数据类型的转换(如 float 转 int),指向基类的指针或引用转为指向派生类的指针或引用等。在派生类被调用时会调用派生类中的函数,不会调用基类中的被重写的函数(基类中的函数需要加上virtual才可以,即基类中的函数是虚函数)。

weixin_50890461的博客 5233

window系统 dlib库安装

1. 安装visual studio 1.1. 安装vs2017或以上版本 1.2. 我们需要安装使用C++的桌面开发,且必须选上用于Cmake的Visual C++工具 1.3. 安装完成后,将D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin 添加到环境变量PATH中 2 下载cmake文件,并添加环境变量 2.1 在c

@bangbang的博客 816

hdu 2121 最小树形图 +虚根

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121   题意:         n个城市,m条单向边,每条边都有一个权值,现在要你求出这样一个节点,由这个节点出发能走遍所有的城市,同时使总权值最小。如果找不到就输出impossible,能的话输出最小权值和这个节点的编号。   做法:        最小树形图虚根的第一道题,因为不能确...

人生如戏 384

【PowerHarmony】电鸿蒙学习记录-准备工作

将获取的“PowerHarmony_PHM_SDK_V1.0.1.0.tar.gz”进行解压。将获取的“code_1.91.1-1720564633_amd64.deb”进行解压。打开后可见所有文件夹,即可进行编辑开发,VSCode也可打开终端进行编译等调试。选择主控类型,我是用的是gd32f470,我选gd32f4xx。Open Folder路径选中SDK解压后根目录即可。选择对应系统类型,我的是小型的,我选mini。选好后即完成工程创建。

Allenzhu的博客 2731

hdu 2121 Ice_cream’s world II(无定根的最小树形图)

Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5200    Accepted Submission(s): 1293 Problem Description After

他说少年如歌 537

告别ZotFile!Zotero 7+百度网盘文献同步全攻略(含软链接避坑指南)

本文针对Zotero 7用户,提供了告别ZotFile插件后,利用百度网盘实现文献附件同步的完整解决方案。详细讲解了如何通过设置Zotero链接目录与创建软链接,将附件库迁移至云盘,并附有详细的避坑指南,确保数据安全与多设备同步的稳定性。

mmm90的博客 586

PostgreSQL 实战:行级安全策略(RLS)详解

PostgreSQL的行级安全(RLS)机制实现了细粒度的数据访问控制,通过动态过滤行数据满足多租户隔离、隐私保护等需求。本文系统介绍了RLS的核心原理、配置方法及实践建议:1) 启用RLS后需定义策略,通过USING和WITH CHECK条件控制访问;2) 适用于SaaS、医疗金融等场景,但需注意COPY命令、外键等特殊情况;3) 建议配合会话变量、索引优化和文档化策略使用。文章还提供了多租户隔离等实战案例,并分析了RLS对查询性能的影响及优化方案。RLS将安全控制下沉至数据库层,显著提升应用安全性和可维

数据知道的博客 3153

HDU 2121 无固定根的最小树形图

参考了http://blog.youkuaiyun.com/wsniyufang/article/details/6747604 本题为不是固定根的最小树形图,我们可以虚拟出一根来,然后在把这个根跟每个点相连,相连的点可以设为无穷大,或者设为所有边和大一点,比如为r,然后就可以利用最小树形图进行计算了,计算出的结果减去r,如果比r还大就可以认为通过这个虚拟节点我们连过原图中两个点,即原图是不连通的,

水 1350

OpenCV实战之人脸美颜美型(八)——大眼(上)

从大众审美的角度来看,眼睛适当的“变大”会让人显得更加年轻。因此美型中就有一项大眼功能,其效果就是让眼睛适当变大,这章内容就围绕着大眼算法展开。

On my way 1211

HDU 2121 Ice_cream’s world II(无固定根最小树形图、找最小根)

题目链接: HDU 2121 Ice_cream’s world II 题意: 有n个城市[编号0–n-1]和m条边需要在n个城市中选择一个城市作为首都,使得从首都到其他城市的都能连通而且路径权值和要最小。如果不能找到这样的首都输出-1,否则输出最小的路径权值和和相应的首都,如果在同一最小路径权值下有多个首都选择,输出最小编号的那个。 分析: 如果原图是可以生成最小树形图,因为只添加了一个

ramay7 578

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

hdu 2121(没有固定根的最小树形图)

Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 659    Accep

志当存高远 1260

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

HDU 2121 Ice_cream’s world II 无固定根的最小树形图以及最小根

Problem Description After awarded lands to ACMers, the queen want to choose a city be her capital. This is an important event in ice_crea

kongming_acm的专栏 655

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

HDU 2121 Ice_cream's world II 朱刘算法求无固定根最小树形图

题目链接:HDU 2121 分析:由于题目要求

791

HDU 4009 Transfer water 朱刘算法求无固定根最小树形图

题目链接:HDU 4009 分析:和

699

hdu 2121 Ice_cream’s world II(无固定根最小树形图)

Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3350    Accepted Submission(s): 797 Problem Description Afte

youngkl博客 627

生成树

POJ 1639 最小度限制生成树 http://poj.org/problem?id=1639

ZZ 427

hdu 2121

本题为无固定根的最小树形图 #include #include #include #include #define N 1010 #define M 20010 #define inf 100000000 using namespace std; int a[N],b[N],c[N]; int in[N],pre[N],id[N],vis[N]; struct Edge{ int u

1292765944的专栏 1493

HDU 2121 Ice_Cream's World II (最小树形图)

(还是比较灵异,我代码重写了一遍,就对了,之前不知道哪里错了,一直wa) 题目分析出来就是无固定跟的最小树形图。 无固定根的话,那就给定一个人工的根! 然后复习一下最小树形图的建图流程: 1、首先,除了根节点以外,给每个节点找到一个最小入边;然后检查除根节点以外其他节点,如果有孤立的节点的话,说明无解! 2、找环,因为只要到达环上的任意一点,那么就可以到达这个环上的其他的所有的点,所以说

AClion的专栏 1129

HDU 2121 无固定点的最小树形图

/* 本题为不是固定根的最小树形图,我们可以虚拟出一根来,然后在把这个根跟每个点相连,相连的点可以设为无穷大,或者设为所有边和大一点,比如为r,然后就可以利用最小树形图进行计算了,计算出的结果减去r,如果比r还大就可以认为通过这个虚拟节点我们连过原图中两个点,即原图是不连通的,我们就可以认为不存在最小树形图。关于输出最小根也挺简单,在找最小入弧时,如果这条弧的起点是虚拟根,那么这条弧的终点就是要求

Strive 497

HDU 2121 Ice_cream’s world II(不定根最小树形图)

大概题意是找出一个点,以这个点为根的最小树形图权值和最小,输出最小树形图的权值以及点的编号。 不定根,所以我们要添加一个虚根...然后就是很多大牛说的方法了... 不过我一直很纳闷,我枚举每一个点为根求最小树形图..然后找出最小,这个一直WA,不明白为啥不是TLE,难道是模板问题?但是我的虚根是1或者n+1都是没问题,看起来不像是只能处理固定点的..求路过的大神解释一下.. #include

484

HDU2121 Ice_cream’s world II【最小树形图】

题意:一个有向图,选一个根节点,使他能到所有点,费用最小 思路:无固定根最小树形图,我们建一个超级根,连接所有点,边权为 原有边权和sum+1,这样子设边权,是因为最后判断的时候如果ans-sum-1 大于 sum的话,也是无解的。原来的边权和sum,现在减去一条边后,比它还大,就说明从超级根,连下来不只一条,不符合题意。 记录是哪个点的话,记录边的位置(新建的边在之后建,减原来的边数

狂奔的蜗牛 224

HDU 2121 Ice_cream’s world II 无固定点的最小树形图 朱刘算法

/* 本题为不是固定根的最小树形图,我们可以虚拟出一根来,然后在把这个根跟每个点相连,相连的点可以设为无穷大,或者设为所有边和大一点,比如为r,然后就可以利用最小树形图进行计算了,计算出的结果减去r,如果比r还大就可以认为通过这个虚拟节点我们连过原图中两个点,即原图是不连通的,我

Join Hands 3711
上一篇: hdu 4009 最小树形图(O(m))
下一篇: hdu 2586 最近公共祖先
nielaishan
博客等级 码龄11年 7粉丝 94原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值