zoukankan      html  css  js  c++  java
  • 最短路径问题

       传送门

    dijkstra算法  O(N2)

    不能处理负边权

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #define N 1e30  //1e30=1.0*10^30 
    int n,m,s,t,k;
    double minn;
    int a[110][3];
    double c[110];
    double cd[110][110];
    bool f[110];
    int main()
    {
       scanf("%d",&n);
       for (int i=1;i<=n;i++)
         scanf("%d%d",&a[i][1],&a[i][2]);
       for (int i=1;i<=n;i++)
         for (int j=1;j<=n;j++)
           cd[i][j]=N;
       scanf("%d",&m);
       for (int i=1;i<=m;i++)
         {
             int x,y;
             scanf("%d%d",&x,&y);
             cd[x][y]=cd[y][x]=sqrt(pow(double(a[x][1]-a[y][1]),2)+pow(double(a[x][2]-a[y][2]),2));
             /*double pow(double x,double y);  用来求x的y次幂*/ 
         }    
       scanf("%d%d",&s,&t);
       memset(f,false,sizeof(f));
       for (int i=1;i<=n;i++) c[i]=cd[s][i];
       c[s]=0;
       f[s]=true;
       for (int i=1;i<=n-1;i++)
         {
             minn=N;
             k=0;
             for (int j=1;j<=n;j++)
               if (!f[j]&&(c[j]<minn))
                 {
                     minn=c[j];
                     k=j;
                 }
            if (k==0) break;
            f[k]=true;
            for (int j=1;j<=n;j++)
              if (c[k]+cd[k][j]<c[j])
                c[j]=c[k]+cd[k][j];//更新的是c[j],而不是cd[s][j] 
         }
       printf("%.2lf
    ",c[t]);
    }
    改了两节课(抓狂)

    Floyed-Warshall算法  O(N3)

    可以处理负边权

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    using namespace std;
    int a[110][3]={0};
    double f[110][110];
    int main()
    {
        int n,m,s,t;
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
          scanf("%d%d",&a[i][1],&a[i][2]);
        scanf("%d",&m);
        memset(f,0x7f,sizeof(f));
        for (int i=1;i<=m;i++)
          {
               int x,y;
               scanf("%d%d",&x,&y);
               f[x][y]=f[y][x]=sqrt(pow(double(a[x][1]-a[y][1]),2)+pow(double(a[x][2]-a[y][2]),2));
          }
        scanf("%d%d",&s,&t);
        for (int k=1;k<=n;k++)
          for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
              if ((i!=k)&&(j!=k)&&(i!=j)&&(f[i][k]+f[k][j]<f[i][j]))
                  f[i][j]=f[i][k]+f[k][j];
        printf("%.2lf
    ",f[s][t]);
        return 0;
    }
    直接把原来的代码粘贴过来了
    I'm so lost but not afraid ,I've been broken and raise again
  • 相关阅读:
    pandas读写csv最简代码
    csv.read和csv.write
    交叉验证
    纪念被win10大更新搞崩的vbox
    c++中关于保留小数的小总结
    Java里的值传递与“引用传递”——一些想法
    Eclipse使用遇到的一些问题及解决方案(持续更新)
    Pray for 京阿尼——愿逝者安息,伤者早日康复
    洛谷p1208—混合牛奶【典型贪心】(关联排序小技巧)
    洛谷p1217—回文质数(默默宣传打表法)
  • 原文地址:https://www.cnblogs.com/sjymj/p/5615759.html
Copyright © 2011-2022 走看看