描述
用迪杰斯特拉算法求一点到其余所有结点的最短路径。
输入
先输入一个小于100的正整数n,然后的n行输入图的邻接矩阵(10000表示无穷大,即两点之间没有边),最后输入两个0到n-1的整数表示两个点,
输出
用迪杰斯特拉算法求第一个点到其余所有结点的最短路径。
并输出这两个点之间的最短路径(按顺序输出最短路径上的每一个点,每个数据占一行)。
并输出这两个点之间的最短路径(按顺序输出最短路径上的每一个点,每个数据占一行)。
输入样例
4
0 2 10 10000
2 0 7 3
10 7 0 6
1000 3 6 0
0 2
0 2 10 10000
2 0 7 3
10 7 0 6
1000 3 6 0
0 2
输出样例
0
1
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);
}