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;
}      

  

转载于:https://www.cnblogs.com/cyiner/archive/2011/07/11/2102908.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值