简单Dijkstra算法应用,具体解释链接如下:
https://baike.baidu.com/item/迪杰斯特拉算法/4049057?fromtitle=Dijkstra算法&fromid=215612&fr=aladdin#5_2
AC代码:
#include<cstdio>
#include<cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
#define max1 10000000 //定义最大值
int a[1000][1000]; //记录数据
int d[1000];//d表示源节点到该节点的最小距离
int p[1000];//p标记访问过的节点
int i, j, k;
int m;//m代表边数
int n;//n代表点数
int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
int min1;
int x,y,z;
if(n==0&&m==0)
return 0;
memset(a,0,sizeof(a));
memset(p,0,sizeof(p));
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
a[x][y]=z;
a[y][x]=z;
}
for( i=1; i<=n; i++)
d[i]=max1;
d[1]=0;
for(i=1;i<=n;i++)
{
min1 = max1;
//下面这个for循环的功能类似冒泡排序,目的是找到未访问节点中d[j]值最小的那个节点,
//作为下一个访问节点,用k标记
for(j=1;j<=n;j++)
if(!p[j]&&d[j]<min1)
{
min1=d[j];
k=j;
}
p[k] = 1; //置1表示第k个节点已经访问过了
for(j=1;j<=n;j++)
if(a[k][j]!=0&&!p[j]&&d[j]>d[k]+a[k][j])
d[j]=d[k]+a[k][j];
}
printf("%d\n",d[n]);
}
return 0;
}