hdu 4408 Minimum Spanning Tree

LSCM最小二乘保角参数化 LSCM最小二乘保角参数化 最小二乘思想 已知一组点的数据(x,y) x x1x_1x1​ x2x_2x2​ x3x_3x3​ … xnx_nxn​ y y1y_1y1​ y2y_2y2​ y3y_3y3​ … yny_nyn​ 可以近似为线性关系 y=ax+by=ax+by=ax+b ,目标为确定常数 aaa , bbb ; 解法:找到 aaa , bbb ,使得所有 yiy_iyi​ 与 axi+bax_i+baxi​+b 偏差的平方和 Q=∑i=1n(yi−axi−b)2 Q=\s 阅读详情

题目连接:点击打开链接

解法:利用kruskal算法 把图划分成森林, 同一点有相同最小的权值到别的点, 通过determinant计算树的课数。

总结:模板 + 自己不太懂 = 记录 + 重新学

代码君:

#include <stdio.h>
#include <iostream>
#include <vector>

#define LL long long

using namespace std;

const int MAX = 105;
const int MAXE = 1005;

struct node
{
    int set[MAX];
    void init(int n)
    {
        for (int i = 0; i <= n; i++)
            set[i] = i;
    }
    int find(int x)
    {
        if (set[x] != x)
            set[x] = find(set[x]);
        return set[x];
    }
    int Union(int x, int y)
    {
        int xx = find(x);
        int yy = find(y);
        if (xx == yy)
            return -1;
        set[xx] = yy;
        return 1;
    }
};

struct Node
{
    int u, v, dis;
};

node a, b, c;
int n, m;
Node e[MAXE];
int visit[MAX];
vector<int> g[MAX];
LL p[MAX][MAX], MOD, deg[MAX][MAX];

bool cmp(Node a, Node b)
{
    return a.dis < b.dis;
}

LL DET(LL a[][MAX], int n)
{
    LL temp = 1, t;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            a[i][j] %= MOD;
    for (int i = 1; i < n; i++)
    {
        for (int j = i + 1; j < n; j++)
            while (a[j][i])
            {
                t = a[i][i] / a[j][i];
                for (int k = i; k < n; k++)
                {
                    a[i][k] -= a[j][k] * t;
                    a[i][k] %= MOD;
                }
                for (int k = i; k < n; k++)
                {
                    t = a[i][k];
                    a[i][k] = a[j][k];
                    a[j][k] = t;
                }
                temp = -temp;
            }
            temp = temp * a[i][i] % MOD;
    }
    return (temp + MOD) % MOD;
}

LL cal_MST_cout()
{
    sort(e + 1, e + m + 1, cmp);
    int pre = e[1].dis;
    LL ans = 1;
    a.init(n);
    b.init(n);
    memset(visit, false, sizeof(visit));
    memset(deg, false, sizeof(deg));
    for (int i = 0; i <= n; i++)
        g[i].clear();
    for (int t = 1; t <= m + 1; t++)
    {
        if (e[t].dis != pre || t == m + 1)
        {
            for (int i = 1; i <= n; i++)
                if (visit[i])
                {
                    int k = b.find(i);
                    g[k].push_back(i);
                    visit[i] = 0;
                }
            for (int i = 1; i <= n; i++)
                if (g[i].size())
                {
                    memset(p, false, sizeof(p));
                    for (int j = 0; j < g[i].size(); j++)
                        for (int k = j + 1; k < g[i].size(); k++)
                        {
                            int x = g[i][j];
                            int y = g[i][k];
                            p[j][k] = p[k][j] = -deg[x][y];
                            p[j][j] += deg[x][y];
                            p[k][k] += deg[x][y];
                        }
                    ans = ans * DET(p, g[i].size()) % MOD;
                    for (int j = 0; j < g[i].size(); j++)
                        a.set[g[i][j]] = i;
                }
            memset(deg, false, sizeof(deg));
            for (int i = 1; i <= n; i++)
            {
                b.set[i] = a.find(i);
                g[i].clear();
            }
            if (t == m + 1)
                break;
            pre = e[t].dis;
        }
        int x = a.find(e[t].u);
        int y = a.find(e[t].v);
        if (x == y)
            continue;
        visit[x] = visit[y] = 1;
        b.Union(x, y);
        deg[x][y]++;
        deg[y][x]++;
    }
    if (!m)
        return false;
    for (int i = 2; i <= n; i++)
        if (b.find(i) != b.find(1))
            return false;
    return ans;
}

int main()
{
    while (~scanf("%d%d%lld", &n, &m, &MOD) && (n | m | MOD))
    {
        for (int i = 1; i <= m; i++)
            scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].dis);
        printf("%lld\n", cal_MST_cout());
    }
}

Jetson AGX Orin 新手避坑:解决‘找不到nvidia-jetpack包’的完整修复指南 本文详细介绍了Jetson AGX Orin设备在安装JetPack开发套件时遇到的'nvidia-jetpack包缺失'问题的完整解决方案。通过分析问题根源、提供分步修复指南以及系统优化建议,帮助开发者快速解决这一常见问题,充分发挥Jetson AGX Orin的边缘计算性能。 阅读详情

相关推荐

树莓派4B+红外传感器:手把手教你DIY一个能走黑线的智能小车(Python代码全解析)

本文详细介绍了如何使用树莓派4B和红外传感器DIY一个智能循迹小车,包括硬件配置、GPIO连接、Python代码实现及优化算法。通过动态PWM调速、状态机设计和赛道记忆算法,提升小车的循迹性能和稳定性。适合初学者和电子爱好者动手实践。

weixin_29188043的博客 266

HEVC/H.265理论知识(3)——帧内预测

一、帧内预测,利用当前图像内已经编码的像素生成预测值 二、生成预测值之后,和原始的值相减,得到残差,后续的变换量化等操作就是基于残差进行处理的 三、帧内预测的大致流程是这样的 (1)遍历所有的预测模式,得到每种模式下的残差信号,再对残差信号进行Hadamard变换计算SATD值 (2)利用SATD值计算每种预测模式的率失真代价,选取率失真代价最小的几种模式(与PU大小相关)

NB_vol_1的专栏 2万+

Argoverse轨迹预测实战:从数据加载到地图API应用全解析

本文详细解析了Argoverse数据集在轨迹预测中的应用,从数据加载到地图API的实战技巧全涵盖。通过具体代码示例展示如何高效处理轨迹数据、实现可视化及基础预测模型,帮助开发者快速掌握自动驾驶轨迹预测的核心技术。特别介绍了Argoverse地图API的深度应用和性能优化经验。

weixin_29182481的博客 241

日期格式RR和YY的区别

RR日期型格式的算法为: 1.如果当前年份的最后两位数(即不包括世纪)为0—49,并且指定的年份的最后两位数也为0—49,则返回的日期在本世纪。 2.如果当前年份的最后两位数(即不包括世纪)为0—49,并且指定的年份的最后两位数为50—99,则返回的日期在上一世纪。 3.如果当前年份的最后两位数(即不包括世纪)为50—99,并且指定的年份的最后两位数为0—49,则返回的日期在下一世纪。 4

Mr_PH的博客 3533

BQ4050开发进阶(二):Protections参数优化策略与实战解析

本文深入解析了BQ4050电池管理芯片中Protections参数的优化策略与实战方法。针对电压、电流、温度等核心保护功能,详细阐述了如何根据具体电芯特性、负载场景和环境因素,精细调整CUV、COV、OCC/OCD等阈值与延时,以在确保电池绝对安全的前提下,实现极致的用户体验与系统可靠性。

rgv234567的博客 479

5分钟搞定JY901S与STM32通信:硬件I2C+DMA配置全流程(附OLED显示教程)

本文详细介绍了如何通过STM32硬件I2C接口配合DMA高效读取JY901S姿态传感器数据,并实现OLED实时显示。文章从硬件连接、I2C与DMA配置、通信协议解析到数据可视化,提供了完整的实战流程和避坑指南,帮助开发者快速构建高精度、低CPU占用的姿态感知系统。

weixin_29185167的博客 480

MySQl数据库-批量添加数据的两种方法

当你需要往数据表中添加数据,如果少量,手动添加其实没什么问题。但是当你需要测试大量数据时,比如要统计一年、一个月、一个星期的数据的区别,而且需求是必须每天都要有数据,这时就需要批量添加数据。在这里以user表为例,记录如何添加数据。 方法一:使用excel表格 方法二:使用insert语句(文件输出流批量写入)使用excel表格1.打开数据表,按照表的字段在excel中添加数据。注意:表中字段名必

YYstrong的专栏 5万+

机器视觉/将HIK海康面阵相机连接Halcon软件

本文简述了如何将海康面阵相机连接到Halcon软件中进行实时取图的过程。

Dahe.qu 4866

在windows下对android进行实时快速录屏和模拟点击(二)——win32 API操控模拟器

从上一节在windows下对android进行实时快速录屏和模拟点击(一)——使用adb命令行当中,描述了适合于所有情况下的通用方法——adb。而通用方法的最大缺点就是:速度非常慢,在有些时候是远远不能满足需求的。为了解决这个问题,本节当中描述一个更高效的方法——通过win32 API直接操控模拟器。而众所周知,windows下编程没有什么能比windows api更为高效了。(对于通常的andr...

yyx112358的博客 3213

秋招突击——笔试整理——8/25——拼多多笔试整理

继续加油! 转变思维,有简单到复杂,由直观到抽象,这种贪心模拟的题目一直是这样的!

Blackoutdragon的博客 2400

第201期 解锁科研效率新高度:Claude 科学技能插件(claude-scientific-skills)深度体验

科研AI助手Claude Scientific Skills开源工具为Claude大模型扩展科学能力,覆盖数据可视化、数学计算、学术格式处理等科研全流程需求。该插件支持LaTeX公式生成、自动化科研图表绘制、学术文档规范校正等功能,让研究人员通过自然语言指令即可完成专业任务。项目开源可定制,支持特定学科需求扩展,目前已托管于GitHub。使用门槛低,只需配置Claude API密钥即可快速启用,帮助科研人员从繁琐技术细节中解放,聚焦核心研究创新。

全网120W+关注AI拉呱,专注人工智能以及科技前沿! 1357

Linux在目录中进入目录创建文件需要哪些权限

1,进入一个目录需要什么权限? 我们现在超级用户root下创建一个dir目录,并且清除它的所有权限chmod 000 dir 我们发现在超级用户root下,没有任何权限我们也可以进入该目录 下来我们将超级用户root下的dir目录的拥有者改为普通用户zhuohai 然后进入dir该目录 我们发现在超级用户root下,不管该目录的拥有者是超级用户还是普通用户,在没有可读,可写,可

zhuohaiyy的博客 1万+

【机器学习】一文搞懂算法模型之:Transformer

必会算法模型之:Transformer

商务合作 | 面试培训 | 职场规划 ==>主页扫码 5607

HDU-4408-Minimum Spanning Tree

HDU-4408-Minimum Spanning Tree http://acm.hdu.edu.cn/showproblem.php?pid=4408 最小生成树的个数 #include #include #include #include #include #include #include #include #include #include #include

comeace的程序人生 556

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

HDU 4408 Minimum Spanning Tree(最小生成树计数)

题目链接: HDU 4408 Minimum Spanning Tree 题意: 给nn个点和mm条边,求生成最小生成树的方案数?答案模pp. 数据范围:n≤100,m≤1000,p≤1010n\leq 100,m\leq 1000, p \leq 10^{10} 分析: 在用KruskalKruskal算法求最小生成树时,我们的做法是: 将图G=V,EG={V,E}中的所有边按照权值

ramay7 726

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

HDU-4408 Minimum Spanning Tree

参考博客:https://www.cnblogs.com/jcf94/p/4071098.html #include&lt;iostream&gt; #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;algorithm&gt; #include&lt;cmath&gt; #include&lt;queue&gt; #inclu...

wl16wzl的博客 350

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

HDU 4408 Minimum Spanning Tree (生成树计数)

Minimum Spanning Tree Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2672Accepted Submission(s): 889 Problem Description XXX is very ...

YIU 253

hdu 4408 Minimum Spanning Tree 最小生成树计数

题意: 给定一个无向带权图,要求求出这个图最小生成树的个数。 思路: 如果不连通的话就输出0。 如果是无权图,直接用矩阵树定理就可以。 对于带全图, 先把所有边排序, 然后从小到大考虑边权, 对于一组边权相同的边, 根据kruskal, 加入了这些边之后, 图的连通性是确定的, 也就是哪些点跟哪些点是不是连通是确定的, 但是选边的方案是不一样的, 于是对选了这组边之后在同一个联通块的边

yamiedie_ 616

HDU 4408 - Minimum Spanning Tree

题解: Kruskal 算法的基本思想是,按照边长排序,然后不断将短边加入集合,最终一步如果能成功把 n-1 条边都加入同一个集合,则找到了最小生成树。在维护集合时,可以使用并查集来快速处理。 如果把 Kruskal 的过程按照边长划分成多个阶段,实际上是处理了所有短边的连通性之后继续处理下一个长度的边的连通性,并依次继续处理剩下边的连通性。 然后我们可以发现,不同长度的边之间的连通性互不影...

weixin_34387284的博客 111

HDU4408 Minimum Spanning Tree (图论)

http://acm.hdu.edu.cn/showproblem.php?pid=4408 题意:求最小生成树的个数 #include #include #include #include #include #include #include #include #include #include #include #include #def

XDU_Truth的专栏 1724

无向图最小生成树计数模板 -- Minimum Spanning Tree HDU - 4408

思想: 最小生成树计数用到了Matrix-Tree定理和贪心、分块思想,Matrix-Tree定理用来求出每个分块的每个联通块的方案数,分块是指按权值给边划分区块。 关于分块: 因为我们求得是最小生成树有多少种的组成方案。最小生成树的总权值是一个定值,不会有比原最小生成树更小的边权,也不能把比生成树中大的权边来作为替换边(那样总权值就不最小了),所以只能是权值相等的边相互替换。关于分块我们要引进 ...

dajiangyou123456的博客 311

【HDU 4408】Minimum Spanning Tree(矩阵树定理 / 最小生成树)

传送门 考虑KruscalKruscalKruscal的过程 按权值从小到大 对每个权值的每个连通块做一次矩阵树 注意判不连通,n=1且m=0,mod=1不连通,n=1且m=0,mod=1不连通,n=1且m=0,mod=1的情况 #include<bits/stdc++.h> using namespace std; #define cs const #define re regist...

Stargazer的博客 329

【HDU 4408】Minimum Spanning Tree(最小生成树计数)

Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Kruskal algorithm of minimum spanning tree, XXX finds that there might be multiple solutions. Given...

dingguayi7025的博客 170

HDU 4408 Minimum Spanning Tree (最小生成树计数)

题意:计算最小生成树个数。 题解:最小生成树计数 若不考虑最小,生成树计数我们知道,可以用矩阵树定理求。我们不妨先考虑最小。 Kruskal中,我们每次选取最短的边将两个连通块连上,对于长度相等的边的集合,无论我们先选哪一条,最后构成的连通情况G0是一样的,即把这个集合的边全部插入后的连通情况与G0相同,但是图不一样。 由此我们可以发现,我们可以将相同长度的边划分为一个阶段,而该阶段是完全与后面的阶段独立的。那么我们将每一个阶段的方案数相乘,其实就是答案。 单独考虑一个阶段,而之前的阶段构成的连通块可以缩点

gongyuandaye的博客 454
上一篇: uva 10254 - The Priest Mathematician
下一篇: 卡哇伊狗狗的spfa模板
luckycoding
博客等级 码龄14年 108粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值