您的位置:首页 > 其它

Dijkstra算法解决最短路径问题

2015-09-18 14:15 435 查看
本文给出了用Dijkstra算法来解决最短路径问题的程序。

输入如下所示:

1 —————–测试用例个数

10 —————–本测试用例的点数

1 2 4 ——————第一个点和第二个点之间的距离是4.

1 3 8

2 3 3

2 4 4

2 5 6

3 4 2

3 5 2

4 5 4

4 6 9

5 6 4

代码如下:

#include <stdio.h>

#define MAX 6
#define MAX_VALUE 65536

typedef struct Node
{
int id;      //节点id
int distance;  //到c1的距离
bool visited;//该点是否被访问
int parent;  // 父节点
}Node;

int v[MAX + 1][MAX + 1] = { 0 };//连接表
Node q[100]; //处理队列
int cur = 0; //尾指针
Node pts[MAX + 1];//标记每个点状态

void insert(Node it)
{
int i = 0;
for (i = 0; i < cur; i++)
{
if (it.distance > q[i].distance)
{
break;
}
}
for (int j = cur - 1; j >= i; j--)
{
q[j + 1] = q[j];
}
q[i] = it;
cur++;
}

void Dijkstra(int s)
{
for (int i = 1; i <= MAX; i++)
{
pts[i].id = i;
pts[i].distance = MAX_VALUE;
pts[i].visited = false;
pts[i].parent = 0;
}

pts[s].distance = 0;
q[cur++] = pts[s];
while (cur!=0)
{
cur--;
Node c = q[cur];
if (pts[c.id].visited)continue;
pts[c.id].visited = true;
for (int i = 1; i <= MAX; i++)
{
if (i == c.id)continue;
if (pts[i].visited)continue;
if (v[c.id][i] == MAX_VALUE)continue;
if (pts[i].distance > pts[c.id].distance + v[c.id][i])
{
pts[i].distance = pts[c.id].distance + v[c.id][i];
pts[i].parent = c.id;
insert(pts[i]);
}
}
}
}

void initV(void)
{
for (int i = 1; i <= MAX; i++)
for (int j = 1; j <= MAX; j++)
{
v[i][j] = MAX_VALUE;
}
}
int a[10] = { 5, 3, 9, 8, 1, 2, 7, 6, 4, 0 };

void qsort(int begin, int end)
{
if (begin >= end)return;

int left = begin;
int right = end;
int key = a[left];
while (left < right)
{
while ((left < right) && (a[right] <= key))right--;
a[left] = a[right];
while ((left < right) && (a[left] >= key))left++;
a[right] = a[left];
}
a[left] = key;
qsort(begin, left-1);
qsort(left+1, end);
}

void printPathDijkstra()
{
for (int i = 1; i <= MAX; i++)
{
printf("%d %d\n", pts[i].id, pts[i].distance);
}
for (int i = 1; i <= MAX; i++)
{
int path[MAX] = {0};
int step = 0;
int cur = i;
do
{
path[step++] = cur;
cur = pts[cur].parent;
} while (cur != 0);
for (int j = step - 1; j >= 0; j--)
{
printf("%d ", path[j]);
}
printf("\n");
}
}

int main(int argc, char** argv)
{
freopen("input.txt", "r", stdin);
int N;
scanf("%d\n", &N);

qsort(0, 9);
for (int case_num = 0; case_num < N; case_num++)
{
initV();
int line_num;
scanf("%d\n", &line_num);
for (int i = 0; i < line_num; i++)
{
int pt1, pt2, distance;
scanf("%d %d %d", &pt1, &pt2, &distance);
v[pt1][pt2] = distance;
v[pt2][pt1] = distance;
}
Dijkstra(1);
printPathDijkstra();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: