单源最短路径(dijkstra算法)
程序员文章站
2024-03-16 14:00:10
...
//时间复杂度 O(n^2)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define inf 0x3f3f3f3f
int map[200][200];
int vis[200];
int dis[200]; //单源最短路径,dis[j]记录的就是起点到j的最短路径
void dijkstra(int S,int N) //S表示start,E表示终点
{
int i,j;
dis[S] = 0; //初始化起始点
vis[S] = 1;
for(i=0;i<N;i++)
{
if(vis[i]==0) //避免自己dis[S]被赋值。
dis[i]=map[S][i]; //算出所有直达
}
for(i=0;i<N;i++) //要进行n次,因为有n个点
{
int minn = inf, mini = S; //minn在新的开始又变成了无穷大
for(j=0;j<N;j++)
{
if(vis[j]==0&&minn>dis[j])
{
minn=dis[j];
mini=j;
}
} //第一个for每能定一个最短。
vis[mini]=1; //做标记,dis[mini]就定住哪个已经是最短了。
for(j=0;j<N;j++)
{
if(vis[j]==0)
{
if(dis[j]>dis[mini]+map[mini][j]) //第二个for是算转达。
{ // 第n个最短,在最后一次之前已经在不断更新的,所以,每次都是最短比最新的,取最短。
dis[j]=dis[mini]+map[mini][j];
}
}
}
}
}
void print(int E)
{
printf("%d\n",dis[E]);
}
int main()
{
memset(vis,0,sizeof(vis));
int n;
int i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&map[i][j]);
}
}
dijkstra(0,n);
for(i=0;i<n;i++)
print(i);
return 0;
}
上一篇: 一文看懂全排列算法!