首页 > 其他分享 >floyd求路径

floyd求路径

时间:2024-04-03 22:12:17浏览次数:21  
标签:cnt int 路径 ++ floyd solve ans path

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <cmath>
#include <string.h>
#define R(x) x = read()
#define For(i, j, n) for (int i = j; i <= n; ++i)
using namespace std;

inline int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}

const int N = 1005;

int n, m;
int g[N][N], f[N][N], ans[N][N];

void 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]);
                if(f[i][j] > f[i][k] + f[k][j])
                {
                    f[i][j] = f[i][k] + f[k][j];
                    ans[i][j] = k;
                }
            }
}

int path[N], cnt;

void solve(int a, int b)
{
    if(!ans[a][b])
        return;
    //path[++cnt] = a;
    solve(a, ans[a][b]);
    path[++cnt] = ans[a][b];
    solve(ans[a][b], b);
    //path[++cnt] = b;
}

void print_path(int a, int b)
{
    if(f[a][b] >= 1000000)
    {
        puts("can not reach");
        return;
    }
    memset(path, 0, sizeof(path));
    cnt = 0;
    path[++cnt] = a;
    solve(a, b);
    path[++cnt] = b;
    printf("the path between %d and %d\n", a, b);
    for(int i = 1; i <= cnt; i++)
        printf("%d ", path[i]);
    puts("");
}

int main()
{
    R(n);R(m);
    memset(f, 0x3f, sizeof(f));
    For(i, 1, m)
    {
        f[i][i] = 0;
    }
    For(i, 1, m)
    {
        int a, b, c;
        R(a);R(b);R(c);
        f[a][b] = min(f[a][b], c);
    }
    floyd();
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
        {
            if(i == j)
            {
                puts("the same point");
                continue;
            }
            print_path(i, j);
        }
    return 0;
}

注意:

void solve(int a, int b)
{
    if(!ans[a][b])
        return;
    //path[++cnt] = a;
    solve(a, ans[a][b]);
    path[++cnt] = ans[a][b];
    solve(ans[a][b], b);
    //path[++cnt] = b;
}

这里不能把起点和终点也算上,因为这一轮的中间点,下一轮就变成起点/终点了,如果算上会导致重复。

标签:cnt,int,路径,++,floyd,solve,ans,path
From: https://www.cnblogs.com/smartljy/p/18113612

相关文章

  • Java最短路径算法知识点(含面试大厂题和源码)
    最短路径算法是计算机科学和图论中的核心问题之一,它旨在找到从一个顶点到另一个顶点或在所有顶点之间的最短路径。这个问题在多种实际应用中都非常重要,如网络路由、交通规划、社交网络分析等。以下是一些与最短路径算法相关的知识点:Dijkstra算法:由荷兰计算机科学家艾兹......
  • Nginx服务器根据不同路径转发到不同的服务
    环境说明linux系统版本:lsb_release-a  Nginx版本:1.24.0  .1.配置nginx服务。.a.先配置upsream;backend名字可以自己任意取,里面可以配置多个server;同样upstream也可以配置多个。.b.然后在server中配置location。以下图为例,第一个配置路径配置直接匹配exam,然后将......
  • Android文件管理器选择文件,获得文件路径URI转File
     前情描述:使用系统文件管理器,选择指定文件类型上传。基础知识MIME调起文件管理器指定浏览位置(路径转URI)设置多种文件类型URI转路径1.MIMEMIME(MultipurposeInternetMailExtensions)是描述消息内容类型的因特网标准。finalStringDOC="application/mswo......
  • 【数据库】数据库系列学习4:数据库学习路径
    学习数据库的路径可以分为以下几个阶段,每个阶段都有不同的学习内容和建议:1.初级阶段1.1理论基础学习关系型数据库的基本概念,如表、行、列、键等。了解SQL语言的基本语法和常用操作,包括创建表、插入数据、查询数据、更新数据、删除数据等。1.2实践操作安装并使用一款关......
  • 在静态页中,js和css使用虚拟路径指向网站根目录
    第一步:修改web.config<configuration><system.webServer><handlers><addname="x"verb="GET"path="*.css.ashx"type="FileResolver"/><addname="xx"verb=&quo......
  • java中获取项目路径包路径域名classpath路径buildPath路径
    /** *获取项目路径 *@returnnull或项目路径 *@throwsIOException */ publicstaticStringgetPojectPath(){ Filedirectory=newFile("");//参数为空 try{ returndirectory.getCanonicalPath(); }catch(IOExceptione){ e.printStackT......
  • 几种常见的路径规划算法
    几种常见的路径规划算法路径规划是机器人、自动驾驶车辆、无人机等领域中的关键技术之一,它涉及到如何为移动实体找到从起点到终点的最优或可行路径。随着技术的不断发展,路径规划算法也在不断进步和优化。下面将介绍几种常见的路径规划算法。1.Dijkstra算法Dijkstra算法是一......
  • 最短路径问题(单源最短路问题-都正边)1.0
    基本思路和代码来自y总!朴素版dijkstra算法适合与稠密图,用邻接矩阵来存图#include<bits/stdc++.h>#include<algorithm>usingnamespacestd;intn,m;//intg[520][520];//存图边的值intdist[520];//存最短距离boolst[520];//是否已经遍历过最小的边intdijks......
  • 赢未来:公司发展战略研究与创新路径
    赢未来:公司发展战略研究与创新路径一、公司发展战略研究的基石:市场洞察与定位在当今快速变化的市场环境中,公司发展战略研究的首要任务是进行深入的市场洞察与精准定位。市场洞察不仅是对市场趋势的把握,更是对消费者需求、竞争对手动态以及行业政策法规的全面了解。通过市场......
  • vant-weapp 提供的areaList城市数据的路径问题
    根据vant官网提供的引入方法会报错。通过add@vant/area-data会下载一份index.esm.mjs文件城市数据在项目中,我尝试了用各种路径来获取还是报错,最后只能将该index.esm.mjs文件复制到其他文件中,然后引入就可以了。 1.新建一个文件夹专门放数据的,然后在建个文件用来放这个......