您的位置:首页 > 其它

用迪杰斯特拉算法求赋权图中的最短路径

2016-03-25 22:32 411 查看
[align=left]描述[/align]
用迪杰斯特拉算法求一点到其余所有结点的最短路径。

[align=left]输入[/align]
先输入一个小于100的正整数n,然后的n行输入图的邻接矩阵(10000表示无穷大,即两点之间没有边),最后输入两个0到n-1的整数表示两个点,

[align=left]输出[/align]
用迪杰斯特拉算法求第一个点到其余所有结点的最短路径。

并输出这两个点之间的最短路径(按顺序输出最短路径上的每一个点,每个数据占一行)。

[align=left]输入样例[/align]
4

0 2 10 10000

2 0 7 3

10 7 0 6

1000 3 6 0

0 2

[align=left]输出样例[/align]
0

1

2

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <stdlib.h>
using namespace std;

const int maxnum = 130;
const int maxint = 10000;

void Dijkstra(int n, int v, int *dist, int *prev, int matrix[maxnum][maxnum])
{
bool visited[maxnum];
int i, j;
for(i = 1; i <= n; i++)
{
dist[i] = matrix[v][i];
visited[i] = 0;
if(dist[i] == maxint)
prev[i] = 0;
else
prev[i] = v;
}

dist[v] = 0;
visited[v] = 1;

// 依次将未放入S集合的结点中,取dist[]最小值的结点,放入结合S中
// 一旦S包含了所有V中顶点,dist就记录了从源点到所有其他顶点之间的最短路径长度
for(i = 2; i <= n; i ++)
{
int temp = maxint;
int u;

for(j = 1; j <= n; j++)
{
if((visited[j]==0)&&(dist[j]<temp))
{
u = j;
temp = dist[j];
}
}
visited[u] = 1;

for(j = 1; j <= n; j++)
{
if((visited[j]==0)&&(matrix[u][j]<maxint))
{
int newdist = dist[u]+matrix[u][j];
if(newdist<dist[j])
{
dist[j] = newdist;
prev[j] = u;
}
}
}
}

}

void searchPath(int *prev, int u, int v)
{
stack<int>s;
while(v!=u)
{
s.push(v);
v = prev[v];
}
s.push(v);
while(!s.empty())
{
cout << s.top()-1 << endl;
s.pop();
}
}

int main()
{
//freopen("test.txt", "r", stdin);
int dist[maxnum];
int prev[maxnum];
int matrix[maxnum][maxnum];
int n;

cin >> n;
int i, j;
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j ++)
{
cin >> matrix[i][j];
}
}
int x, y;
cin >> x >> y;

Dijkstra(n, x+1, dist, prev, matrix);
//    for(i = 1; i <= n; i++)
//        printf("%d%c", dist[i], i == n?'\n':' ');
searchPath(prev, x+1, y+1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: