能求解任意点为起点的单源最短路径问题,并能输出到任意一点的最短路径的路径
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<memory.h>
#include<cstdio>
#include<list>
#include<string>
#include<cmath>
#include <algorithm>
#include <queue>
#define NUM 100
#define maxint 10000
using namespace std;
int c[NUM][NUM];
int dist[NUM];
int pre[NUM];
void dijkstra(int * dist ,int pre[] , int c[][NUM] ,int v ,int num)
{
int i ,j;
bool sum[num];
for(i = 1;i<=num;i++)
{
dist[i] = c[v][i];
sum[i] = false;
pre[i] = dist[i]>maxint?0:v;
}
pre[v] = v;
sum[v] = true;
dist[v] = 0;
for(i = 1;i<num;i++)
{
int mini = maxint;
int pos = 0;
for(j = 1;j<=num;j++)
{
if((!sum[j]) && dist[j] <mini )
{
mini = dist[j] ;
pos = j;
}
}
sum[pos] = true;
for(j = 1;j<=num;j++)
{
if((!sum[j]) && (c[pos][j] < maxint))
{
if(c[pos][j] + dist[pos] < dist[j])
{
dist[j] = dist[pos] + c[pos][j];
pre[j] = pos;
}
}
}
}
}
int main()
{
freopen("in.txt", "r", stdin);
int n,m;
while(scanf("%d%d",&n,&m)!=EOF&& (m||n))
{
memset(c,1,sizeof(c));
memset(dist, 0, sizeof(dist));
memset(pre, 0, sizeof(pre));
for(int i = 1;i<=m;i++)
{
int x ,y , weight;
cin>>x>>y>>weight;
c[x][y] = weight;
}
dijkstra(dist,pre,c,1,n);
for(int i= 1;i<=n;i++)
{
cout<<dist[i]<<" ";
}
cout<<endl;
}
}
输入:
5 7
1 2 10
1 4 25
1 5 80
2 3 40
3 5 10
4 3 20
4 5 50
0 0
输出:
0 10 45 25 55
2<--1
3<--4<--1
4<--1
5<--3<--4<--1