第1关:单源最短路径问题
#include<iostream>
#include<sstream>
#include<string>
using namespace std;
#define maxint 9999
template<class Type>
void Dijkstra(int n,int v,Type dist[],int prev[],Type c[][6])
{
bool s[maxint];
for(int i = 1;i <= n;i ++ )
{
dist[i] = c[v][i];
s[i] = false;
if(dist[i] == maxint) prev[i] = 0;
else prev[i] = v;
}
dist[v] = 0;
s[v] = true;
for(int i = 1;i < n;i ++ )
{
int temp = maxint;
int u = v;
for(int j = 1;j <= n;j ++ )
{
if((!s[j]) && (dist[j] < temp))
{
u = j;
temp = dist[j];
}
}
s[u] = true;
for(int j = 1;j <= n;j ++ )
{
if((!s[j]) && (c[u][j] < maxint))
{
Type newdist = dist[u] + c[u][j];
if(newdist < dist[j])
{
dist[j] = newdist;
prev[j] = u;
}
}
}
}
for(int i = 1;i <= n;i ++ ) cout << dist[i] << ' ';
cout << endl;
for(int i = 2;i <= n;i ++ )
{
int j = i;
while(j != 1) cout << j << "<-",j = prev[j];
cout << 1 << endl;
}
}
int main()
{
int c[6][6]={{0},{0,0,10,maxint,30,100},
{0,maxint,0,50,maxint,maxint},
{0,maxint,maxint,0,maxint,10},
{0,maxint,maxint,20,0,60},
{0,maxint,maxint,maxint,maxint,0}};
int dist[6]={0};
int prev[6]={0};
Dijkstra(5,1,dist,prev,c);
return 0;
}