最短路径问题

   传送门

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\n",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\n",f[s][t]);
    return 0;
}
直接把原来的代码粘贴过来了

 

posted @ 2016-06-25 08:28  外婆桥  阅读(179)  评论(0编辑  收藏  举报