zoukankan      html  css  js  c++  java
  • 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
    ",ans);
        }
        
        return 0;
    }
    View Code
    一道又一道,好高兴!
  • 相关阅读:
    CSwinform程序分页
    C#跨线程访问控件
    CS程序发布版本后提示自动升级功能
    winform控件的二次开发
    JavaNetty拆包粘包(二)
    JavaNetty(一)
    JavaAIO编程
    javaNIO编程
    Java中bio编程
    如何使用CryptoJS配合Java进行AES加密和解密
  • 原文地址:https://www.cnblogs.com/laiba2004/p/3543519.html
Copyright © 2011-2022 走看看