最短路问题顾名思义,就是求一个点到另一个点的最短路径。先来介绍一种简单的算法,它只有5行,但是因为用了三层for循环,所以容易超时,但是处理较小数据还是一个挺不错的算法。
首先将给出的路径初始化并赋值:
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j)
e[i][j]=0;
else
e[i][j]=9999999;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
e[x][y]=z;
}
接下来就是代码的核心:
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(e[i][j]>e[i][k]+e[k][j])
e[i][j]=e[i][k]+e[k][j];
如果遇到比较大的输入这种算法就会超时,接下来介绍一种较大数据也不会超时的算法,dijk算法。
跟上一个一样,先赋值:
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j)
e[i][j]=0;
else
e[i][j]=9999999;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
e[x][y]=z;
}
我们计算一下1号点到各个点的距离
初始化一下dis数组和book数组:
for(int i=1;i<=n;i++)
dis[i]=e[1][i];
memset(book,0,sizoef(book));
book[1]=1;
接下来就是算法的核心:
for(int i=1;i<=n-1;i++)
{
//寻找距离一号点最近的点
int minn=9999999;
int u;
for(int j=1;j<=n;j++)
{
if(book[j]==0&&dis[j]<minn)
{
minn=dis[j];
u=j;
}
book[u]=1;
for(int j=1;j<=n;j++)
{
if(e[u][j]<9999999)
{
if(dis[j]>dis[u]+e[u][j])
dis[j]=dis[u]+e[u][j];
}
}
}
}