热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2020.08.23日常总结:探讨无向图的最小环问题及Floyd算法的本质

[Problem]\color{green}{\texttt{[Problem]}}[Problem]给定一个nnn个点mmm条边的无向图,求出一个至少有333个点的环,使得环上的

[Problem]\color{green}{\texttt{[Problem]}}



  • 给定一个 nn 个点 mm 条边的无向图,求出一个至少33 个点的环,使得环上的边的边权的总和最小。无解就输出 No solution.(注意,. 是必须的)。

  • 1n100,1m5×1031 \leq n \leq 100,1 \leq m \leq 5 \times 10^3

  • dd 为边权的最大值,则有 1d1×1051\leq d \leq 1 \times 10^5


[Solution]\color{green}{\texttt{[Solution]}}

[Part one]\color{blue}{\texttt{[Part one]}} Floyd 的本质是什么?

对于很多人(包括一年前的笔者)而言,Floyd 算法就是:

for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)f[i][j]=min(f[i][j],f[i][k]+f[k][j]);

这样一个 O(n3)O\left (n^3\right) 的多源最短路算法而已。

但是为什么 Floyd 算法是对的呢?这就涉及它的核心。

原始的 Floyd 是这样的:记 fk,i,jf_{k,i,j} 表示从 iijj 且只使用 1k1-k 号节点作为中转点的最短路长度。什么是中转点,就是最短路径 (i,j)(i,j) 上除了 iijj 的那些点。

于是我们有如下的转移方程:

fk,i,j=min1lk1{fk1,i,k+fk1,k,j}f_{k,i,j}=\min\limits_{1 \leq l \leq k-1}\left \{f_{k-1,i,k}+f_{k-1,k,j}\right \}

它的意义是先只用 11ll 号节点做中转点从 ii 走到 kk,再只用 11ll 号节点做中转点从 kk 走到 jj

于是我们可以用滚动数组优化它,就得到了我们上面的代码(顺便一提,正是因为我们用了滚动数组,所以 kk 才要在最外层)。

[Part two]\color{blue}{\texttt{[Part two]}} 回归原题

讲了这么多,它和原题有什么关系呢?

我们假设这个环上有一条边 (i,j)(i,j),去除这条边后,剩下的一定是从 iijj 的最短路,如图:

在这里插入图片描述

有什么用?我们随便找两个点 iijj,求出它们在只使用 11k1k-1 号点作为中转点时的最短路 Ti,j,k1T_{i,j,k-1}ff 实在出现了太多次了,所以为了让读者明白究竟方式了什么,这里换一个字母),连接点 iikk,在连接点 kkjj,就可以得到一个环。

所以,最小的环的权值(就是换上所有边的权值总和)ans\texttt{ans} 的推导式为:

ans=mini,j,k{1..n}{Tk1,i,j+ai,k+ak,j}\texttt{ans}=\min\limits_{i,j,k \in \left \{ 1..n \right \} } \left \{ T_{k-1,i,j}+a_{i,k}+a_{k,j} \right \}

ai,ja_{i,j} 表示边 (i,j)(i,j) 的权值(长度)。

注意,图上必须要有边 (i,k)(i,k) 和边 (k,j)(k,j) 才可以。

[code]\color{blue}{\texttt{[code]}}

typedef long long ll;
const ll inf=0x3f3f3f3f3f3f;
ll a[110][110],f[110][110],n,m,ans;
inline void ckmin(ll &a,ll b){a=min(a,b);//让a取到a,b间较小值
}
int main(){scanf("%lld%lld",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)f[i][j]=a[i][j]=inf;for(int i=1,u,v,w;i<=m;i++){scanf("%d%d%d",&u,&v,&w);ckmin(a[u][v],w);ckmin(a[v][u],w);ckmin(f[u][v],w);ckmin(f[v][u],w);}ans=inf;//求最小,初始极大 for(int k=1;k<=n;k++){for(int i=1;i<k;i++)for(int j=i+1;j<k;j++)ckmin(ans,f[i][j]+a[i][k]+a[k][j]);for(int i=1;i<=n;i++)if (i!=k&&f[i][k]!=inf)for(int j=1;j<=n;j++)if (j!=i&&j!=k&&f[k][j]!=inf)ckmin(f[i][j],f[i][k]+f[k][j]);}if (ans!=inf) printf("%lld",ans);else printf("No solution.");return 0;
}洛谷的P6175就是模板哦。

推荐阅读
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 本文介绍如何利用栈数据结构在C++中判断字符串中的括号是否匹配。通过顺序栈和链栈两种方式实现,并详细解释了算法的核心思想和具体实现步骤。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 云函数与数据库API实现增删查改的对比
    本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ... [详细]
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
  • This request pertains to exporting the hosted_zone_id attribute associated with the aws_rds_cluster resource in Terraform configurations. The absence of this attribute can lead to issues when integrating DNS records with Route 53. ... [详细]
author-avatar
mobiledu2502917797
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有