当前位置: 首页 > wzjs >正文

银川网站建设哪家优婚纱网站制作

银川网站建设哪家优,婚纱网站制作,凯里小程序开发公司,网络开发公司是干什么的一、题目: 二、题解: 1、我们一眼就可以看出这是一道多源最短路的题目,因此直接套用Floyd模板即可 2、Floyd原理解析 2.1:假设现在我们有这样一个图,要求我们求任意两个顶点的距离 2.2:对于这个样例&…

一、题目:

在这里插入图片描述

二、题解:

1、我们一眼就可以看出这是一道多源最短路的题目,因此直接套用Floyd模板即可

2、Floyd原理解析

2.1:假设现在我们有这样一个图,要求我们求任意两个顶点的距离

在这里插入图片描述

2.2:对于这个样例,我们使用Floyd来做的步骤如下:(顺序不能改变!!)

在这里插入图片描述

  • 其中,我们并不关心两个点之间是怎么连接的,仅仅只是枚举所有情况,查看是否有其他情况使得两个点之间的路径更小
    在这里插入图片描述

2.3:也就是意味着我们要使用 O O O(n3)的时间复杂度,因此点/边的数量级一般<1e3

我们并不证明公式的正确性,背下模板即可

三、代码解析如下:

3.1:代码分块解析

它的核心思想是通过多次迭代来更新路径,逐步得到图中任意两点的最短距离。下面是详细分块解释:

1. 常量与类型定义

typedef long long ll;
const int N=307;
ll dis[N][N];  //表示从i-->j的距离
  • typedef long long ll;:定义 lllong long 类型的别名,简化代码书写。
  • const int N=307;:定义常量 N 为 307,表示最多有 307 个节点。这个值是预设的最大节点数,通常会根据问题要求进行调整。
  • ll dis[N][N];:定义一个二维数组 dis,用来存储节点间的最短距离,dis[i][j] 表示从节点 i 到节点 j 的最短距离。

2. solve() 函数

void solve()
{ll n,m,q;cin>>n>>m>>q;memset(dis,0x3f,sizeof(dis));
  • ll n,m,q;cin>>n>>m>>q;:输入图的节点数 n,边数 m,以及询问次数 q
  • memset(dis,0x3f,sizeof(dis));:初始化 dis 数组,填充为一个非常大的值(0x3f3f3f3f),表示初始状态下所有节点之间的距离都是无穷大,除非通过边连接。
    • 0x3f3f3f3f 代表一个足够大的值,用于模拟“无穷大”。在后面的计算中,任何距离小于这个值的都会被替代。

3. 输入边的信息并更新距离

    for(int i=1;i<=m;i++){ll ui,vi,wi;cin>>ui>>vi>>wi;dis[ui][vi]=min(dis[ui][vi],wi);    //对重边/自环的处理}
  • for(int i=1;i<=m;i++):循环处理每一条边。
  • cin>>ui>>vi>>wi;:输入边的信息,uivi 是节点,wi 是边的权重。
  • dis[ui][vi]=min(dis[ui][vi],wi);:更新 dis 数组中 dis[ui][vi] 的值,如果已经有路径存在,取最小值。这样可以处理重边或自环的情况,即如果两点之间有多个边,则选择权重最小的那个边。

4. 初始化对角线

    for(int i=1;i<=n;i++) dis[i][i]=0;
  • 这里将每个节点到自身的距离设置为 0,因为任何节点到自身的最短路径显然是 0。

5. Floyd算法核心

    for(int k=1;k<=n;k++)//中转点for(int i=1;i<=n;i++)   //起始点for(int j=1;j<=n;j++)   //指向点dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
  • 这部分实现了 Floyd-Warshall 算法的核心逻辑。
    • k 是中转点,表示通过 k 来更新其他节点之间的最短路径。
    • 外层的 i 表示起始点,内层的 j 表示目标点。
    • dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]); 这个公式的含义是,如果从 ij 的路径通过 k 节点更短,则更新 dis[i][j] 的值。通过三重循环对每一对节点 (i, j) 进行更新,遍历所有可能的中转点 k

6. 处理询问

    while(q--)  //q次询问{ll ui,vi;cin>>ui>>vi;if(dis[ui][vi]>=4e18)   cout<<-1<<'\n';else cout<<dis[ui][vi]<<'\n';}
}
  • while(q--):处理每次询问,询问次数为 q
  • cin>>ui>>vi;:输入一对节点 uivi
  • if(dis[ui][vi]>=4e18):如果 dis[ui][vi] 的值大于等于一个非常大的值 4e18(即无穷大),说明这两点之间不可达,输出 -1
  • else cout<<dis[ui][vi]<<'\n';:否则,输出 dis[ui][vi],即节点 ui 到节点 vi 的最短距离。

3.2:完整代码:

#include<bits/stdc++.h>
using namespace std;typedef long long ll;
const int N=307;
ll dis[N][N];  //表示从i-->j的距离void solve()
{ll n,m,q;cin>>n>>m>>q;memset(dis,0x3f,sizeof(dis));for(int i=1;i<=m;i++){ll ui,vi,wi;cin>>ui>>vi>>wi;dis[ui][vi]=min(dis[ui][vi],wi);    //对重边/自环的处理}//初始化for(int i=1;i<=n;i++) dis[i][i]=0;for(int k=1;k<=n;k++)//中转点for(int i=1;i<=n;i++)   //起始点for(int j=1;j<=n;j++)   //指向点dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);while(q--)  //q次询问{ll ui,vi;cin>>ui>>vi;if(dis[ui][vi]>=4e18)   cout<<-1<<'\n';else cout<<dis[ui][vi]<<'\n';}
}int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int _=1;while(_--)solve();return 0;
}
http://www.dtcms.com/wzjs/554986.html

相关文章:

  • 网上做效果图网站如何在手机上做自己的网站6
  • 深圳网站开发设计公司排名郑州设计公司有哪些
  • 南昌网站建设公司网站建设公司哪家好一站式做网站公司
  • php中网站搜索功能实现如何自己做淘宝网站
  • 做外国网站自媒体动漫做暧视频在线观看网站
  • 开发网站过程随州做网站的公司
  • 做百度推广得用网站是吗wordpress文章筛选
  • 网站开发架构分类网站数据丢失
  • 带表情的wordpress留言seo网站建设时文章频率
  • 酒店如何做团购网站个人网站主页怎么做
  • 移动商城 网站建设方法方式网络营销的机遇和挑战
  • 公司 网站 苏州wordpress slider使用
  • 北京网站设计十年乐云seo怎么做网站自己当站长
  • 怎样建设一个网站wordpress 众筹模板
  • 如果建立网站广州网络广告推广公司
  • 一个网站怎么做app有没有做网站的团队
  • 建设银行网站看不到e商百度电话怎么转人工
  • 阿里云建站后台wordpress火车头采集软件发布接口
  • 网站seo诊断湖南岚鸿诊断icp备案查询
  • 网页设计需要做什么东莞网站优化方法有哪些
  • 免费建立网站论坛企业网站打包下载
  • 开发网站合作协议天元建设集团有限公司设计研究院赵纪峰联系方式
  • 湖州专业做网站线上设计师接单
  • linux主机做网站网站模版化配置
  • 燃气公司网站建设方案网站商品展示设计
  • 中国建设银行官企业网站官方网站app
  • 内网穿透做网站个人网站能百度推广吗
  • 行业网站设计wordpress在线教育功能
  • 中山搜索引擎优化网站源码如何优化
  • 做竞价网站要准备什么条件助君网络怎么样