描述
给一个赋权图(无向图),求0号结点到其余所有结点的最短路径的长度。
输入
先输入一个正整数n,然后输入赋权图的邻接矩阵(10000表示无穷大)
输出
按结点编号的顺序输出0号结点所有结点的最短路径的长度。
输入样例
6
0 1 4 10000 10000 10000
1 0 2 7 5 10000
4 2 0 10000 1 10000
10000 7 10000 0 3 2
10000 5 1 3 0 6
10000 10000 10000 2 6 0
0 1 4 10000 10000 10000
1 0 2 7 5 10000
4 2 0 10000 1 10000
10000 7 10000 0 3 2
10000 5 1 3 0 6
10000 10000 10000 2 6 0
输出样例
0 1 3 7 4 9
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
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 = v;
//找出当前未使用的点j的dist最小值
for(j = 1; j <= n; j ++)
{
if((visited[j]==0) && (dist[j]<temp))
{
u = j;
temp = dist[j];
}
}
visited[u] = 1;//加入到已访问集合
//cout << "i = " << i << endl;
//更新dist
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;
}
}
}
// cout << "distance ==========<<"<< endl;
// for(int i = 1; i <= n; i ++)
// cout << dist[i] <<" ";
// cout << endl;
// cout << "prev =============<< " << endl;
// for(int i = 1; i <= n; i ++)
// cout << prev[i] <<" ";
// cout << endl;
// cout << endl;
}
}
void searchPath(int *prev, int v, int u)
{
stack<int>s;
int temp = u;
s.push(u);
while(1)
{
temp = prev[temp];
if(temp == v)
{
s.push(temp);
break;
}
else
{
s.push(temp);
}
}
while(!s.empty())
{
cout << s.top() << " " ;
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];
}
}
Dijkstra(n, 1, dist, prev, matrix);
for(i = 1; i <= n; i++)
printf("%d%c", dist[i], i == n? '\n':' ');
//searchPath(prev, 1, n);
}