1342:【例4-1】最短路径问题

最短路径问题

Floyd算法

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;

const int N=105;
int a[N][2];
double d[N][N];
int main(){
    int m,n,s,e;
    cin>>n;
    for(int i=1;i<=n;i++){
        scanf("%d%d",a[i],a[i]+1);
    }
    memset(d,0x7f,sizeof(d));//初始化
    cin>>m;
    while(m--){
        int x,y;
        scanf("%d%d",&x,&y);
        d[x][y]=d[y][x]=sqrt(pow(a[x][0]-a[y][0],2)+pow(a[x][1]-a[y][1],2));
    }
    cin>>s>>e;
    //Floyd算法
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
                d[j][k]=min(d[j][k],d[j][i]+d[i][k]);
    printf("%.2lf",d[s][e]);
}

Dijkstra算法

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;

const int N=105;
int a[N][2];
double d[N][N],c[N];
bool f[N];
double maxx=1e30;
int main(){
    int m,n,s,e;
    cin>>n;
    for(int i=1;i<=n;i++){
        scanf("%d%d",a[i],a[i]+1);
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            d[i][j]=maxx;//初始化
    cin>>m;
    while(m--){
        int x,y;
        scanf("%d%d",&x,&y);
        d[x][y]=d[y][x]=sqrt(pow(a[x][0]-a[y][0],2)+pow(a[x][1]-a[y][1],2));
    }
    cin>>s>>e;
    for(int i=1;i<=n;i++)
        c[i]=d[s][i];
    memset(f,false,sizeof(f));
    f[s]=true;
    c[s]=0;
    //Dijkstra算法
    for(int i=1;i<n;i++){
        double minn=maxx;
        int k=0;
        for(int j=1;j<=n;j++){
            if(!f[j]&&c[j]<minn){
                minn=c[j];
                k=j;
            }
        }
        if(!k)break;
        f[k]=true;
        for(int j=1;j<=n;j++)
            c[j]=min(c[j],c[k]+d[k][j]);
    }
    printf("%.2lf",c[e]);
    return 0;
}
posted @ 2021-10-21 20:08  Rekord  阅读(192)  评论(0编辑  收藏  举报