Problem B: 迪克斯特拉算法
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 22 Solved: 14
[ Submit][ Status][ Web Board]
Description
对于如图所示的一个带权有向图,采用迪克斯特拉算法求出从顶点0到其他各顶点的最短路径及其长度。
Input
Output
To 1 1 1
To 2 4 2
……
……
#include <iostream>
#include <stdio.h>
#define inf 37000
using namespace std;
void dispath(int g[][6],int *dist ,int *path, int *s,int v)
{
int i,j,k;
for(i=0;i<6;i++)
{
if(s[i]==1&&i!=v)
{printf("To %d %d",i,dist[i]);
j=1;
k=i;
while(path[k]!=0)
{
j++;
k=path[k];
}
printf(" %d\n",j);
}
}
}
void dijkstra(int g[][6],int v)
{
int dist[6],path[6];//距离,路径
int s[6];
int min1,i,j,u;
for(i=0;i<6;i++)//初始化距离,路径
{
dist[i]=g[v][i];
s[i]=0;
if(dist[i]<inf)
path[i]=v;
else path[i]=-1;
}
s[v]=1;
path[v]=0;
for(i=0;i<6;i++)
{
min1=inf;
for(j=0;j<6;j++)//找出离s数组最小的那个数
{
if(min1>dist[j]&&s[j]==0)
{
u=j;
min1=dist[j];
}
}
s[u]=1; //把最小的数加入s数组
for(j=0;j<6;j++)//查找通过新加入的点是否有离s数组更近的路径
{
if(s[j]==0)
if(dist[j]>(dist[u]+g[u][j])&&g[u][j]<inf)
{
dist[j]=dist[u]+g[u][j];
path[j]=u;
}
}
}
dispath(g,dist,path,s,v);//输出
}
int main()
{
int a[6][6]={0,1,5,2,37000,37000,37000,0,3,37000,7,37000,37000,37000,0,37000,37000,6,37000,37000,37000,0,37000,8,37000,37000,37000,37000,0,5,37000,37000,37000,37000,37000,0};
dijkstra(a,0);
return 0;
}