poj 3268

/*两次单源最短路径 
输入的时候一次正向记录路径
一次反向记录路径 */
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define INF 99999
int t[1001][1001],dd[1001][1001];
int v[1001],dp[1001],dp2[1001];
int n,w;
void f(int d[][1001])
{
    memset(v,0,sizeof(v));
    for(int i=1;i<=n;i++)
   {
        d[i][i]=0;
        dp[i]=(i==w?0:INF);
   }
    for(int i=1;i<=n;i++)
    {
         int x,m=INF;
    for(int y=1;y<=n;y++)
     if(!v[y]&&dp[y]<m)
     {
         m=dp[y];
         x=y;
     }
     v[x]=1;
     for(int y=1;y<=n;y++)
       if(dp[y]>dp[x]+d[x][y])
       dp[y]=dp[x]+d[x][y];

    }
}
int main()
{

    int m;
    cin>>n>>m>>w;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {t[i][j]=INF;dd[i][j]=INF;}
    
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        dd[a][b]=c;
        t[b][a]=c;
    }
    f(dd);
    for(int i=1;i<=n;i++)
	{dp2[i]+=dp[i];}
	f(t);
	int max=0;
    for(int i=1;i<=n;i++)
	{dp2[i]+=dp[i];
	if(dp2[i]>max)
	max=dp2[i];}
	cout<<max<<endl;
    return 0;
}      

  

posted @ 2011-07-11 12:31  Crazy_yiner  阅读(518)  评论(0编辑  收藏  举报