Floyd算法及其扩展应用--待更

 Floyd算法的证明

void floyd()//三层循环实现floyd算法
{
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
           d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}


 Floyd的运用
Floyd算法及其扩展应用--待更_第1张图片

  1.牛的旅行(最短路)

牛的旅行http://ybt.ssoier.cn:8088/problem_show.php?pid=1343 Floyd算法及其扩展应用--待更_第2张图片

#include
#define x first
#define y second
using namespace std;
const int N=160;
const double INF=1e20;
typedef pair pii;
pii p[N];
char g[N][N];
double dist[N][N];
double maxd[N];
int n;
double get_dist(pii a,pii 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=0;i>p[i].x>>p[i].y;
  for(int i=0;i>g[i];
  for(int i=0;i=INF)//假如不在一个牧场才相连
            res2=min(res2,get_dist(p[i],p[j])+maxd[i]+maxd[j]);//假如这两个点相连
   printf("%lf\n",max(res1,res2));//输出二者的最大
    return 0;
}

2.排序(传递闭包)

343. 排序 - AcWing题库icon-default.png?t=N4P3https://www.acwing.com/problem/content/345/

#include
using namespace std;
const int N=30;
int d[N][N];
bool st[N];
int n,m;

void floyd()//用Floyd更新其他的点
{
    for(int k=0;k>n>>m,n||m)
    {
        memset(d,0,sizeof d);
        int type=0,t;
        for(int i=1;i<=m;i++)
        {
            char str[5];
            cin>>str;
            int a=str[0]-'A',b=str[2]-'A';
            
            if(!type)
            {
                d[a][b]=1;//标记a

你可能感兴趣的:(acwing提高,最短路,图论,算法)