POJ 3268

//将边倒转后存放在两个数组中使用两次Dijkstra算法
#include <iostream>
#include <string.h>  //memset的头文件
using namespace std;
#define arraysize 1001
int maxData = 0x7fffffff; //最大整数
int dis[arraysize][arraysize]; 
int revdis[arraysize][arraysize];
bool final[arraysize];
int d[arraysize];
int revd[arraysize];
int N,M,X;
int sumDis[arraysize];
void Dij()
{
 memset(final,0,sizeof(final));
 memset(d,0,sizeof(d));
 for(int i=1;i<N+1;++i)
 {
  d[i] = dis[X][i];
 }
 final[X] = true;
 d[X] = 0;
 for(int i1=1;i1<N;++i1)
 {
  int min = maxData;
  int v = X;
  for(int i2=1;i2<N+1;++i2)
  {
   if(!final[i2] && min>d[i2])
   {
    min = d[i2];
    v = i2;
   }
  }
  final[v] = true;
  for(int i3=1;i3<N+1;++i3)
  {
   if(!final[i3] && dis[v][i3]<maxData)
   {
    if(d[v]+dis[v][i3]<d[i3])
    {
     d[i3] = d[v]+dis[v][i3];
    }
   }
  }
 }

 memset(final,0,sizeof(final));
 memset(revd,0,sizeof(revd));
 for(int i7=1;i7<N+1;++i7)
 {
  revd[i7] = revdis[X][i7];
 }
 final[X] = true;
 revd[X] = 0;
 for(int i4=1;i4<N;++i4)
 {
  int min = maxData;
  int v = X;
  for(int i5=1;i5<N+1;++i5)
  {
   if(!final[i5] && min>revd[i5])
   {
    min = revd[i5];
    v = i5;
   }
  }
  final[v] = true;
  for(int i6=1;i6<N+1;++i6)
  {
   if(!final[i6] && revdis[v][i6]<maxData)
   {
    if(revd[v]+revdis[v][i6]<revd[i6])
    {
     revd[i6] = revd[v]+revdis[v][i6];
    }
   }
  }
 }

 int tempmaxData = 0;
 for(int j=1;j<N+1;++j)
 {
  sumDis[j] = d[j]+revd[j];
  if(sumDis[j]>tempmaxData)
  {
   tempmaxData = sumDis[j];
  }
 }
 cout<<tempmaxData<<endl;
}
int main()
{
 //freopen("1.txt","r",stdin);
 while(cin>>N>>M>>X)
 {
  int start,end,weight;
  for(int i1=1;i1<N+1;++i1)
  {
   for(int i2=1;i2<N+1;++i2)
   {
    dis[i1][i2] = maxData;
    revdis[i1][i2] = maxData;
   }
  }
  for(int i=0;i<M;++i)
  {
   cin>>start>>end>>weight;
   dis[start][end] = weight;  //正常存储距离
   revdis[end][start] = weight; //将距离倒转后进行存储
  }
  Dij();
 }
 return 0;
}

posted @ 2010-04-24 21:28  北海小龙  阅读(171)  评论(0编辑  收藏  举报