poj 3268 Silver Cow Party(最短路,正反两次,这个模版好)

题目

 

Dijkstra,正反两次最短路,求两次和最大的。

 

#define  _CRT_SECURE_NO_WARNINGS
//这是找出最短路加最短路中最长的来回程
//也就是正反两次最短路相加找最大的和
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;

const int MAXN=1010;  

#define typec int  
const typec INF=0x3f3f3f3f;//防止后面溢出,这个不能太大  
bool vis[MAXN];  
typec cost1[MAXN][MAXN],cost2[MAXN][MAXN];
typec lowcost1[MAXN],lowcost2[MAXN];
void Dijkstra1(int n,int beg)  
{  
    for(int i=1;i<=n;i++)
    {
        lowcost1[i]=cost1[beg][i];vis[i]=false;
    }
    for(int i=1;i<=n;i++)
    {
        typec temp=INF;
        int k=-1;
        for(int j=1;j<=n;j++)
        {
            if(!vis[j]&&lowcost1[j]<temp)
            {
                temp=lowcost1[j];
                k=j;
            }
        }
        vis[k]=true;
        for(int l=1;l<=n;l++)
        {
            if(!vis[l])
            {
                lowcost1[l]=min(lowcost1[l],lowcost1[k]+cost1[k][l]);
            }
        }
    }
}
void Dijkstra2(int n,int beg)  
{  
    for(int i=1;i<=n;i++)
    {
        lowcost2[i]=cost2[beg][i];vis[i]=false;
    }
    for(int i=1;i<=n;i++)
    {
        typec temp=INF;
        int k=-1;
        for(int j=1;j<=n;j++)
        {
            if(!vis[j]&&lowcost2[j]<temp)
            {
                temp=lowcost2[j];
                k=j;
            }
        }
        vis[k]=true;
        for(int l=1;l<=n;l++)
        {
            if(!vis[l])
            {
                lowcost2[l]=min(lowcost2[l],lowcost2[k]+cost2[k][l]);
            }
        }
    }
}


int main()
{
    int n,m,t,i,j,a,b,c;
    while(scanf("%d%d%d",&n,&m,&t)!=EOF)
    {
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                cost1[i][j]=cost2[i][j]=(i==j)? 0:INF;

        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            if(cost1[a][b]>c)
            {
                cost1[a][b]=c;//
            }
            if(cost2[b][a]>c)
            {
                cost2[b][a]=c;//
            }
        }
        Dijkstra1(n,t);//
        Dijkstra2(n,t);//
        int ans=-1;
        for(i=1;i<=n;i++)
        {
            lowcost1[i]+=lowcost2[i];
            ans=ans>lowcost1[i]? ans:lowcost1[i];
        }
        printf("%d\n",ans);
    }
    
    return 0;
}
View Code

 

posted @ 2014-02-10 21:04  laiba2004  Views(244)  Comments(0Edit  收藏  举报