最短路径
思路:先记录1到所有点的距离(没有连线记为无穷大)为到达该点的最短路径长,然后从1开始利用贪心思想依次找出到下一个连接点的最短距离,然后再找以该点为基准的下一个距离最近的点,判断从1先到一个点再到该点的距离与从1直接到该点距离的大小,若小,则更新dis[]距离长,否则不更新
若不理解,建议看看简单易懂——Dijkstra算法讲解
#include<stdio.h>
#define max 110
#define inf 99999999
int a[max][max],dis[max],vis[max];
int m,n,from,to,val,i,j,w,min;
void Dijkstra()
{
for(i=1;i<=n;i++)//创建一个二维矩阵,存储各边路径权信息
{
for(j=1;j<=n;j++)
{
if(i==j)a[i][j]=0;//初始化各点间的权值均为无穷大,除了自身到自身的点
else a[i][j]=inf;
}
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&from,&to,&val);
a[from][to]=val;//对矩阵边信息进行初始化
}
for(i=1;i<=n;i++)
{
dis[i]=a[1][i];//储存第1~第i个点间的距离
}
for(i=1;i<=n;i++)
{
vis[i]=0;// 记录第i个点是否被访问过
}
vis[1]=1;//设置第一个点已访问
for(i=1;i<=n-1;i++)
{
min=inf;
for(j=1;j<=n;j++)//寻找下一个未被访问的点且权值最小
{
if(vis[j]==0&&dis[j]<min)
{
min=dis[j];
w=j;
}
}
vis[w]=1;//记录该点已被访问
for(j=1;j<=n;j++)
{
if(a[w][j]<inf)//查找与该点相连的边
{
if(a[w][j]+dis[w]<dis[j])// 若相连的边到连接的点的距离小于1直接到该点的距离,更新dis[]的最短距离
dis[j]=a[w][j]+dis[w];
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);//输入点数与边数
Dijkstra();
printf("%d",dis[n]);//输出到编号为n的点的最短路径
return 0;
}