ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Floyd

2021-06-04 03:01:21  阅读:189  来源: 互联网

标签:初始化 int 路径 Floyd 0x3f3f3f3f 101 dis


Floyd

最简单的最短路径算法,计算任意两点的最短路径,适用于负边权。通过O(n^3)的时间复杂度找到最短路径

代码模板

dis[u][v]表示从uv的最短路径长度。初始化:点uv如果有边连接,则dis[u][v]=w[u][v]。如果不相连则dis[u][v]=INF

for (int k = 1; k <= n; k++) {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (dis[i][j] > dis[i][k] + dis[k][j])
				dis[i][j] = dis[i][k] + dis[k][j];
		}
	}
}

dis[i][j]得出的就是从ij的最短距离。

思想

三层循环,第一层循环中间点k,第二、三层循环起点和终点ij,如果点i到点k的距离加上点k到点j的距离小于原先点i到点j的距离,那么就做更新。

值得注意

  1. 如果将dis[][]初始化为INT_MAX,那么在循环中计算距离时可能产生溢出。建议初始化为0x3f3f3f3f,因为0x3f3f3f3f + 0x3f3f3f3f并不会超出INT_MAX,memset(,0x3f,sizeof())。
  2. if语句可加入i^j && i^k && j^k的判断,因为在初始化时,到自身的距离因为0,可直接跳过。

例题

洛谷P1364 医院设置

代码如下

#include <bits/stdc++.h>
using namespace std;

int n, w[101], u, v, dis[101][101];
int main() {
    memset(dis, 0x3f, sizeof dis);
    cin >> n;
    for (int i = 1; i <= n; i++) {
        dis[i][i] = 0;
        cin >> w[i] >> u >> v;
        dis[i][u] = dis[u][i] = 1;
        dis[i][v] = dis[v][i] = 1;
    }
    for (int k = 1; k <= n; k++) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (i^j&&i^k&&j^k && dis[i][j] > dis[i][k] + dis[k][j])
                    dis[i][j] = dis[i][k] + dis[k][j];
            }
        }
    }
    int res = 0x7f7f7f7f;
    for (int i = 1; i <= n; i++) {
        int temp = 0;
        for (int j = 1; j <= n; j++) {
            temp += w[j] * dis[i][j];
        }
        res = min(res, temp);
    }
    printf("%d\n", res);
    return 0;
}

标签:初始化,int,路径,Floyd,0x3f3f3f3f,101,dis
来源: https://www.cnblogs.com/ybit/p/14847840.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有