单源最短路径:
dijkstra算法(算出S到所有结点的最短路径(包括自己))
记录前驱:
void path(int d)
{
if(pre[d] != -1)
{
path(pre[d]);
printf("%d\n", pre[d]);
} //没法记起点与终点
}
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++)
{
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];
path[j]=mini;
}
}
}
}
}
任意两点间的最短距离
Floyd算法:
void floyd(int N)
{
int i,j,k;
for(k=0;k<N;k++)
for(i=0;i<N;i++)
for(j=0;j<N;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}