四种最短方法同时实现本题目:
code:
code:
- #include<stdio.h>
- #define M 110
- struct node{
-
int u,v,w; - }edge[M*M];
- int m,n,a[M][M];
- //以下注释中的(v表示结点数)(v表示边数)(k为一个常数,其值由实际情况决定)
- //在求已知两点间的距离时没有下面三种方法效率高
- //但在求图中所有点的两两之间有一定的优势
- //时间复杂度为 O(v^3)
- int floyd()
- {
-
int i,j,k; -
for(k=1;k<=n;k++) -
for(i=1;i<=n;i++) -
if(a[i][k]>=0) -
for(j=1;j<=n;j++) -
if(a[k][j]>=0&&(a[i][k]+a[k][j]<a[i][j]||a[i][j]<0)) -
a[i][j]=a[i][k]+a[k][j]; -
return a[1][n]; - }
- //处理由1点向各点的最短距离是bellman_ford的优化
- //效率低于Dijkstra,但可处理负边权
- //时间复杂度为 O(k*e)
- int spfa()
- {
-
int q[M],head=0,tail=1,i,x,d[M],f[M]; -
for(i=2;i<=n;i++)f[i]=d[i]=-1; -
d[1]=0; -
q[0]=1; -
f[1]=0; -
while(head!=tail){ -
x=q[head++]; -
f[x]=-1; -
head%=n+1; -
for(i=1;i<=n;i++) -
if(a[x][i]>=0&&(a[x][i]+d[x]<d[i]||d[i]<0)){ -
d[i]=a[x][i]+d[x]; -
if(f[i]){ -
f[i]=0; -
q[tail++]=i; -
tail%=n+1; -
} -
} -
} -
return d[n]; - }
- //在求两点间最短距离时,效率最高,前题是没有负边权
- //即不能求有负边权的图的最短路问题
- //时间复杂度为 O(v^2)
- int Dijkstra()
- {
-
int f[M],d[M],x=1,i; -
for(i=2;i<=n;i++)f[i]=d[i]=-1; -
d[1]=0; -
while(x){ -
f[x]=0; -
for(i=1;i<=n;i++) -
if(a[x][i]>=0&&(a[x][i]+d[x]<d[i]||d[i]<0)) -
d[i]=a[x][i]+d[x]; -
x=0; -
for(i=1;i<=n;i++) -
if(f[i]&&d[i]>=0&&(!x||d[i]<d[x]))x=i; -
} -
return d[n]; - }
- //在求两点间最短路问题上效率较低,只优越于floyd
- //又由于有他的优化形式spfa(在大多数情况下spfa较优),因此不常用
- //时间复杂度为 O(v*e)
- int bellman_ford()
- {
-
int i,j,d[M]; -
for(i=1;i<=n;i++)d[i]=-1; -
d[1]=0; -
for(i=1;i<n;i++) -
for(j=0;j<m;j++){ -
if(d[edge[j].u]>=0&&(d[edge[j].u]+edge[j].w<d[edge[j].v]||d[edge[j].v]<0)) -
d[edge[j].v]=d[edge[j].u]+edge[j].w; -
if(d[edge[j].v]>=0&&(d[edge[j].v]+edge[j].w<d[edge[j].u]||d[edge[j].u]<0)) -
d[edge[j].u]=d[edge[j].v]+edge[j].w; -
} -
return d[n]; - }
- int main()
- {
-
int x,i,j,w,k=0,ans; -
while(scanf("%d%d",&n,&m),m||n){ -
for(k++,i=1;i<=n;i++){ -
for(j=1;j<=n;j++)a[i][j]=-1; -
a[i][i]=0; -
} -
for(x=0;x<m;x++){ -
scanf("%d%d%d",&i,&j,&w); -
edge[x].u=i;edge[x].v=j;edge[x].w=w; -
if(a[i][j]<0||a[i][j]>w)a[i][j]=a[j][i]=w; -
} -
if(k%4==0)ans=floyd(); -
else if(k%4==1)ans=spfa(); -
else if(k%4==3)ans=Dijkstra(); -
else ans=bellman_ford(); -
printf("%dn",ans); -
} -
return 0; - }