这个是按着我上面的那篇关于Dijkstra算法的理解写的poj 3268的代码。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
int tu[1100][1100],book[1010],n,go[1010],backk[1010];
void chushihua(int n);
int zuiduanlu(int here,int to);
int main()
{
int m,x,i,j,k;
while(~scanf("%d%d%d",&n,&m,&x))
{
chushihua(n);
int a,b,c,mm=m;
while(mm--)
{
scanf("%d%d%d",&a,&b,&c);
tu[a][b] = c;
}
for(i=1; i<=n; i++)
go[i] = tu[i][x];
book[x] = 1;
for(i=1; i<n; i++)
{
int inf = 10000000,u;
for(j=1; j<=n; j++)
if(book[j]==0 && inf > go[j])
inf = go[j] , u = j;
book[u] = 1;
for(k=1; k<=n; k++)
if(book[k]==0 && go[k]>go[u]+tu[k][u])
go[k] = go[u]+tu[k][u];
}
memset(book,0,sizeof(book));
for(i=1; i<=n; i++)
backk[i] = tu[x][i];
book[x] = 0;
for(i=1; i<n; i++)
{
int inf=10000000,u;
for(j=1; j<=n; j++)
if(book[j]==0 && inf>backk[j])
inf = backk[j] , u = j;
book[u] = 1;
for(k=1; k<=n; k++)
if(book[k]==0 && backk[k]>backk[u]+tu[u][k])
backk[k] = backk[u]+tu[u][k];
}
int minn=go[1] + backk[1];
for(i=2; i<=n; i++)
if(minn < go[i] + backk[i])
minn = go[i] + backk[i];
printf("%d\n",minn);
}
return 0;
}
void chushihua(int n)
{
memset(book,0,sizeof(book));
int i,j;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
if(i == j)
tu[i][j] = 0;
else
tu[i][j] = 10000000;
}
}