• 最短路(模板)


    Floyd 最短路
    (时间复杂度O(N^3),适用于出现负边权的情况,可以求任意两点间的最短路径)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<vector>
    #define LL long long 
    int a[101][3];
    double dis[101][101];
    using namespace std;
    int main()
    {
        int n,m;
        scanf("%d",&n); 
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&a[i][1],&a[i][2]);
        }
        memset(dis,0x7f,sizeof(dis));
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            dis[x][y]=dis[y][x]=sqrt((a[x][1]-a[y][1])*(a[x][1]-a[y][1])+(a[x][2]-a[y][2])*(a[x][2]-a[y][2]));
        }
        for(int k=1;k<=n;k++)
         for(int i=1;i<=n;i++)
          for(int j=1;j<=n;j++)
          {
              if(dis[i][k]+dis[k][j]<dis[i][j])
               dis[i][j]=dis[i][k]+dis[k][j];
          }//算法
        int s,t;
        scanf("%d%d",&s,&t);
        printf("%.2lf",dis[s][t]);
        return 0;
    }

    Folyed也可变形为判断两点间是否存在通路伪代码如下

    for(int k=1;k<=n;k++)
     for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
       dis[i][j]=dis[i][j]||(dis[i][k]&&dis[k][j]);

    Dijkstra 最短路

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<vector>
    #define LL long long 
    using namespace std;
    double maxx=1e30;
    double minl;
    int a[101][3];
    double dis[101];
    int pre[101];
    int f[101];
    double l[101][101];
    int main()
    {
        int n,m;
        scanf("%d",&n); 
        for(int i=1;i<=n;i++)
          scanf("%d%d",&a[i][1],&a[i][2]);
        scanf("%d",&m);
    
        memset(l,0x7f,sizeof(l));
    
        for(int i=1;i<=m;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            l[x][y]=l[y][x]=sqrt((a[x][1]-a[y][1])*(a[x][1]-a[y][1])+(a[x][2]-a[y][2])*(a[x][2]-a[y][2]));
        }
        int s,t; 
        scanf("%d%d",&s,&t);
        for(int i=1;i<=n;i++)dis[i]=maxx;
        dis[s]=0,pre[s]=0,f[s]=1;
        for(int i=1;i<=n;i++)
         dis[i]=l[s][i];
        for(int i=1;i<=n-1;i++)//已经找到s这个点,所以循环n-1即可 
        {
            int k=0;
            minl=maxx;
            for(int j=1;j<=n;j++)
             if(f[j]==0&&dis[j]<minl)
             {
                 minl=dis[j];
                 k=j;
             }
            f[k]=1;
    
            if(k==0)break;//找到 
            for(int p=1;p<=n;p++)
            {
                if(l[k][p]+dis[k]<dis[p])
                 pre[p]=k,dis[p]=l[k][p]+dis[k];
            }
        }
        printf("%.2lf",dis[t]);
        return 0;
    }
  • 相关阅读:
    C# 多态性
    C# FileStream类
    C# File文件类
    加快访问GitHub的速度
    Git-修改.gitignore后使其配置生效的方法总结
    ES6 解构赋值
    avue表单数据请求
    uniapp canvas组件复用
    uniappH5 fly.js Golang 解决跨域问题
    java bug记录
  • 原文地址:https://www.cnblogs.com/dfsac/p/6819788.html
Copyright © 2020-2023  润新知