//最短路算法复习整理:
#include <iostream>
#include <cstring> //必须要加这个头文件,memset()清空数组的时候用到
using namespace std;
int map[1000][1000]; //表示从一个点到另一个点的距离
int dis[1000]; //距离数组
int vis[1000]; //访问数组
#define inf 99999 //声明一个无穷变量
void D(int n) //迪杰斯特拉算法
{
int i,j;
int pos;
for(i=1;i<=n;i++)
{
dis[i]=map[1][i]; //对dis数组进行初始化
}
vis[1]=1; //标记第一个点已经访问过
for(i=1;i<=n-1;i++) //对剩下的n-1个点进行逐个的访问
{
pos=1;
int min=inf;
for(j=1;j<=n;j++)
{
if(!vis[j] && dis[j]<min)//更新最短路径
{
min=dis[j];
pos=j; //标记访问下标的点
}
}
vis[pos]=1; //把当前的pos点标记问访问
for(j=1;j<=n;j++)
{
if(!vis[j] && dis[j]>dis[pos]+map[pos][j])//路径更新
dis[j]=dis[pos]+map[pos][j];
}
}
if(dis[n]!=inf)
cout<<dis[n]<<endl;
else
cout<<"-1"<<endl;
}
int main()
{
int n,m;
int a,b,x;
int i,j;
while(cin>>n>>m)
{
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
map[i][j]=inf;
}
map[i][i]=0;
}
for(i=1;i<=m;i++)
{
cin>>a>>b>>x;
if(map[a][b]>x)
map[a][b]=map[b][a]=x;
}
D(n);
}
return 0;
}
最短路代码资料
最新推荐文章于 2024-02-01 17:01:51 发布