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;
}