一般用来求俩个点的最短的距离
方法1:
Floyd算法:
通过三层循环,将每种情况一一比较,最后得出最短的路径。
代码
#include<stdio.h>
int main()
{
int e[202][202],k,i,j,n,m,t1,t2,t3,start,end;
int inf=999999999;//这里设该数为无穷大
while(~scanf("%d%d",&n,&m))
{
//初始化 e[i][j]表示从i到j的距离
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j)//如果起始地相同则距离为零
e[i][j]=0;
else
e[i][j]=inf;
}
for(i=0;i<m;i++)
{
scanf("%d%d%d",&t1,&t2,&t3);
if(e[t1][t2]>t3)//在后面如果重复输入俩点的距离,取最小值
e[t1][t2]=e[t2][t1]=t3;
}
scanf("%d%d",&start,&end);//输入起点与终点
//以下五行为核心代码
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(e[i][j]>e[i][k]+e[k][j])//如果于第三个点k,能让i到j距离变短
//,就更新i到j的距离
e[i][j]=e[i][k]+e[k][j];
if(e[start][end]!=inf)
printf("%d\n",e[start][end]);
else
printf("-1\n");
}
return 0;
}
该方法核心代码十分简单,只有五行,但是该方法时间复杂度位N的三次方,比较大,在时间上要求不高的时候可以使用。
2.Dijkstra算法
通过用一个数组记录一个源点到其他个点的距离,然后找到一个离该点最近的点,并标记。因为该点离这个点最近,所以不可能会通过第三个点来减少这俩点之间的路程,然后依次找下去,找到最短路径
代码
#include<stdio.h>
int e[1001][1001];
int main()
{
int dis[1001],book[1001],i,j,n,m,t1,t2,t3,u,v,min;
//book数组记录哪些点已经被确定
int inf=99999999;
while(~scanf("%d%d",&m,&n))
{
//初始化
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j)e[i][j]=0;
else e[i][j]=inf;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&t1,&t2,&t3);
if(e[t1][t2]>t3)
{
e[t1][t2]=t3;
e[t2][t1]=t3;
}
}
//将源点到各点的距离储存在dis数组里面
for(i=1;i<=n;i++)
dis[i]=e[1][i];
for(i=1;i<=n;i++)
book[i]=0;
book[1]=1;//源点为确定点
for(i=1;i<n;i++)
{
min=inf;
for(j=1;j<=n;j++)//寻找最近点
{
if(book[j]==0&&dis[j]<min)
{
min=dis[j];
u=j;
}
}
book[u]=1;//标记确定点
for(v=1;v<=n;v++)
{
if(e[u][v]<inf)
{
//如果可以源点可以通过标记点缩短到其他点的距离
//更新值
if(dis[v]>dis[u]+e[u][v])
dis[v]=dis[u]+e[u][v];
}
}
}
printf("%d\n",dis[n]);
}
return 0;
}
以上就是常用的俩种最短路径方法