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