Floyd——人人都是中间商(50%)
时间:2021-07-17
本文章向大家介绍Floyd——人人都是中间商(50%),主要包括Floyd——人人都是中间商(50%)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Floyd——人人都是中间商
引入
- 有n座相互孤立的岛屿,每座岛屿都拥有被其他岛屿搭建桥梁的机会,但在起始的时候,每座岛屿并没有向其他岛屿搭建桥梁的能力,突然有一天,资金突然丰富起来了,但只能按顺序给这些岛屿,并使得这些岛屿具有向其他岛屿搭建桥梁的机会,同时一旦发现要新搭建的且能使得AB两地的桥梁长度比原本使得AB两地通行的桥梁来得短,就拆掉原本的桥梁,搭起新桥梁,否则就放弃新的搭建计划。
粗糙的原理分析
- Floyd本质上是动态规划,在未做滚动数组优化来省去一个维度时,
dist[k][i][j]
表示的是在使用前k个结点时,点i到点j的最短距离,而当k==总结点时即已经纳入了所有的点(所有的情况)进行了考虑。
注意点
初始化
- 起初各自点并没有来当中介的点,只能自己到达自己 (给距离赋值为0),而无法到达别人家(给距离赋值为INF)
赋值
- 可能出现重边的现象(所谓重边就是两个点之间存在两条及以上的边),这个时候我们应该保留较小的边就行。
适用
- 小空间稠密阵
- 能接受$ O(n^3)$的题目。
应用
模板题
#include<bits/stdc++.h>
using namespace std;
const int N= 2e2+10,INF =0x3f3f3f3f;
int n,m,q;
int dist[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++)
dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
}
int main()
{
memset(dist,0x3f,sizeof(dist));
cin>>n>>m>>q;
for(int i=1;i<=n;i++)dist[i][i]=0;//起初各自点并没有中介的点,只能自己到达自己
for(int i=0;i<m;i++)
{
int x,y,z;
cin>>x>>y>>z;
dist[x][y]=min(dist[x][y],z);//有可能出现重边
}
floyd();
for(int i=0;i<q;i++)
{
int x,y;
cin>>x>>y;
if(dist[x][y]!=INF)
cout<<dist[x][y]<<endl;
else cout<<"impossible"<<endl;
}
return 0;
}
直径的拼凑问题
- 我们希望配凑出的直径要尽可能小,找出来的点能够直接拼起来,而不是多加上几条边。
- 要确定点,可以先用floyd对所有点先跑一遍。
- double数组不要用0x3f填充,会得到一个比1还小的数
- AcWing 1125. 牛的旅行,dededebug
#include<bits/stdc++.h>
using namespace std;
const int N = 260,INF = 99999999;
int n;
struct dot{
double x,y;
};
char g[N][N];//记录的仅仅是第i个点是否和第j点联通的情况
double dist[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++)
dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
}
double get_dist(dot a,dot b)
{
return sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) );
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) dist[i][i]=0;//错误点:不要让后面的操作覆盖掉它
dot dots[n+1];
for(int i=1;i<=n;i++)
cin>>dots[i].x>>dots[i].y;
//读入联通的情况
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>g[i][j];
if(g[i][j]=='1')
dist[i][j]=get_dist(dots[i],dots[j]);
else if(i!=j)
dist[i][j]=INF;
}
floyd();
//(间接联通)可以借用dist数组来判断联通关系比较模糊的两点之间的情况
//不用再去写并查集
//要找直径,就是要确立当前点中到所有连接的点中的最远距离
double ans1=0;//答案有可能在自己圈里,新加入的牧场由于长度太小,可能没有对直径产生影响
double max_dot_dis[N+1];
memset(max_dot_dis,0,sizeof(max_dot_dis));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dist[i][j]!=INF)
{
max_dot_dis[i]=max( max_dot_dis[i], dist[i][j] ); // cout<<max_dot_dis[i]<<" ";
ans1=max( ans1, max_dot_dis[i] );
}
}
}
double ans2=INF;//比小要设大,比大要设小
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(dist[i][j]==INF)//如果两者距离比较大(没有联通而已,但还是有距离),则认为两者分属不同的牧场
ans2=min( max_dot_dis[i] + max_dot_dis[j] + get_dist(dots[i],dots[j]) ,ans2);//错误点2:取小
cout<<fixed<<setprecision(6)<<max(ans1,ans2);//这里是被迫取其大,两小中取较大者
return 0;
}
无向图的最小环问题
原文地址:https://www.cnblogs.com/BeautifulWater/p/15024712.html
- 【Dev Club分享】iOS黑客技术大揭秘
- Linux终端:用cat命令查看不可见字符
- golang 函数定义及其接口实例
- 分享两种圣诞节雪花特效JS代码(网站下雪效果)
- React 移动 web 极致优化
- golang 高效字符串拼接
- Linux+Nginx/Apache/Tomcat新增SSL证书,开启https访问教程
- golang 使用时间通过md5生成token
- golang中对map操作类
- Nginx在线服务状态下平滑升级或新增模块的详细操作记录
- 【Dev Club分享】微信读书iOS性能优化
- [svn: E155004]svn update报database is locked错误的解决办法
- WordPress高亮插件:Crayon Syntax Highlighter加载优化
- 深入理解 ButterKnife,让你的程序学会写代码
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【colab pytorch】使用tensorboardcolab可视化
- 实用,完整的HTTP cookie指南
- django-URL之从URL中获取关键字(七)
- springmvc之使用POJO作为参数
- 【猫狗数据集】利用tensorboard可视化训练和测试过程
- springmvc之视图解析流程
- 【猫狗数据集】从命令行接收参数
- django-URL重定向(八)
- Jetpack新成员,App Startup一篇就懂
- python之利用魔术方法实现自己定义的二维向量
- 【猫狗数据集】使用top1和top5准确率衡量模型
- django-URL反向解析Reverse(九)
- spring之如何在web应用中使用?
- 【猫狗数据集】使用预训练的resnet18模型
- django-URL应用命名空间(十)