69,371
社区成员
发帖
与我相关
我的任务
分享
#define N 6 //元素数
#define COST_MAX 1000 //最大int值
//查找最短路径
void Dijkstra(unsigned int graph[][N], int vBegin, int vEnd, unsigned int distance[N], int previous[N])
{
int i, j;
int selected; //当前选择项
unsigned int most_shortest, dis; //最短路径长度
int Unselected[N]; //尚未选择的项
selected = vBegin;
//初始化distance为最大值
for( i = 0; i < N; ++i)
{
distance[i] = COST_MAX;
previous[i] = -1;
Unselected[i] = 0;
}
distance[vBegin] = 0; //与自反距离为0
previous[selected] = selected;
//查找最短距离
for( i = 0; i < N; ++i)
{
//如果此点已被选入,则排除
if(Unselected[ i ] == -1) continue;
most_shortest = COST_MAX;
//查找并选择路径里的最短路径
for( j = 0; j < N; ++j )
{
if(Unselected[ j ] == -1) continue;
if(graph[ selected ][ j ] < most_shortest)
{
most_shortest = graph[ selected ][ j ];
selected = j;
}
}
Unselected[selected] = -1;
//对每条从preselected的边,重新计算另一顶点路径长度
for( j = 0; j < N; ++j)
{
if(graph[selected][j] == COST_MAX) continue;
dis = distance[selected] + graph[selected][j];
if(distance[j] > dis){
distance[j] = dis;
previous[j] = selected;
}
}
if(selected == vEnd) break;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char* vetex[] = {"A","B","C","D","E","F"};
unsigned int distance[N];
int previous[N];
int begin = 0, end = 3;
unsigned int cost[N][N] =
{
{0, 6, 3, COST_MAX, COST_MAX, COST_MAX},
{6, 0, 2, 5, COST_MAX, COST_MAX},
{3, 2, 0, 3, 4, COST_MAX},
{COST_MAX, 5, 3, 0, 2, 3},
{COST_MAX, COST_MAX, 4, 2, 0, 5},
{COST_MAX, COST_MAX, COST_MAX, 3, 5, 0}
};
Dijkstra(cost, begin, end, distance, previous);
//输出最短路径
printf("the shortest path (%s -> %s)is[%d]:", vetex[begin], vetex[end], distance[end]);
printf("%S", vetex[end]);
while(previous[end] != begin)
{
end = previous[end];
printf("%S", vetex[end]);
}
printf("%S\n", vetex[begin]);
for(int i = 0; i < N; i++){
printf("the cost from %s to %s is %d\n", vetex[begin], vetex[i], distance[i]);
}
return 0;
}