博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Floyd算法
阅读量:6291 次
发布时间:2019-06-22

本文共 1338 字,大约阅读时间需要 4 分钟。

弗洛伊德算法

基本思想

  • 先限制从u到v的路径只能经过1号结点或不经过1号结点
  • 再放宽限制,u到v的路径可以从2号结点或不经过2号结点
  • 以此类推,从u到v的路径可以经过任意中继结点或者不经过任意中继节点

特性

  • 可以处理负边

源码 HDU 1874

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;#define MS(x,i) memset(x,i,sizeof(x))#define rep(i,s,e) for(int i=s; i<=e; i++)#define sc(a) scanf("%d",&a)#define scl(a) scanf("%lld",&a)#define sc2(a,b) scanf("%d %d", &a, &b)#define debug printf("debug......\n");#define pfd(x) printf("%d\n",x)#define pfl(x) printf("%lld\n",x)const double eps=1e-8;const double PI = acos(-1.0);const int inf = 0x3f3f3f3f;const ll INF = 0x7fffffff;const int maxn = 2e2+10;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0 , 0};int dis[maxn][maxn];int s,e;int x,y,w;int n,m;//起点可以从0 改为 1void Floyd(){ rep(k,0,n)//中继点从0到n开始枚举 rep(i,0,n)// 从i到j的距离更新 可以多经过中继点 rep(j,0,n) if(dis[i][j] > dis[i][k] + dis[k][j]) dis[i][j] = dis[i][k] + dis[k][j];}int main(){ while(cin>>n>>m){ rep(i,0,n){ rep(j,0,n){ if(i==j) dis[i][j] = 0; else dis[i][j] = inf; } } rep(i,1,m){ cin>>x>>y>>w; if(dis[x][y] > w){ dis[x][y] = w; dis[y][x] = w; } } Floyd(); cin>>s>>e; if(dis[s][e] == inf) cout<<-1<

转载于:https://www.cnblogs.com/czsharecode/p/10715638.html

你可能感兴趣的文章
[ZJOI2010]count 数字计数
查看>>
多校4 1001 Olympiad
查看>>
hdu1085 Holding Bin-Laden Captive!
查看>>
hdu4811 Ball
查看>>
Docker实践--搭建Yapi测试平台
查看>>
align-content 与 align-items 区别
查看>>
a链接中,name属性的应用
查看>>
Java精选笔记_多线程(创建、生命周期及状态转换、调度、同步、通信)
查看>>
java Session统计在线用户,并且显示在线用户
查看>>
spring boot集成jpa(mysql)
查看>>
js实现的玫瑰花
查看>>
大话设计模式之责任链模式
查看>>
记录libreoffice实现office转pdf(适用于windows、linux)
查看>>
Python爬虫入门这一篇就够了
查看>>
彻底卸载Cygwin
查看>>
【转】安卓开发一个月之心得(广告平台篇)
查看>>
salt 批量部署与配置
查看>>
python使用cx_oracle模块连接oracle数据库
查看>>
IOS UINavigationController 更改返回按钮
查看>>
SqlServer2005 性能调校之 利用Sql Server Profiler捕捉阻塞事件(转)
查看>>