zoukankan      html  css  js  c++  java
  • hdu 1385

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    #define N 2005
    #define INF 0x3f3f3f3f
    #define LL __int64
    #define INF 0x3f3f3f3f
    int ma[N][N],d[N],vis[N],pre[N],dis[N][N],b[N];
    int judge(int x,int y,int v0)
    {
        int s1[2000],s2[2000],len1 = 0,len2 = 0,i,j;
        s1[len1++] = y,s2[len2++] =y;
        while(y!=v0) {s1[len1++] = pre[y];y = pre[y];}
        s2[len2++] = x;
        while(x!=v0) {s2[len2++] = pre[x];x = pre[x];}
        for(i = len1-1,j = len2-1 ; i>=0&&j>=0 ; i--,j--)
            if(s1[i]<s2[j]) return 0;
            else if(s1[i]>s2[j]) return 1;
            if(i<0&&j>=0) return 0;
            else if(i>=0&&j<0) return 1;
        return 1;
    }
    void dijkstral(int v0,int n)
    {
        int v,x,y,temp,i;
        for(i = 1 ; i <= n ; i++)
        {
            d[i] = dis[v0][i];
            if(d[i]!=INF) pre[i] = v0;
            vis[i] = 0;
        }
        d[v0] = 0;
        vis[v0] = 1;
        for(i = 1 ; i <= n ; i++)
        {
            temp = INF;
            for(y = 1 ; y <= n ;y++)
                if(!vis[y]&&temp>d[y]) temp = d[x=y];
            vis[x] = 1;
            for(y = 1 ; y <= n ; y++)
                if(!vis[y]&&d[x]+dis[x][y]<d[y])
                {
                     d[y] = d[x]+dis[x][y];
                     pre[y] = x;
                }
                else if(!vis[y]&&d[x]+dis[x][y]==d[y])//判断字典序
                {
                    if(judge(x,y,v0)) pre[y] = x;
                }
        }
    }
    int main()
    {
        int n,m,i,j,k,s,t;
        while(~scanf("%d",&n),n)
        {
            for(i = 1 ; i<= n ; i++)
                for(j = 1 ; j<= n ; j++)
                {
                    scanf("%d",&ma[i][j]);
                    if(ma[i][j] == -1) ma[i][j] = INF;
                }
                for(i = 1 ; i<= n ;i++) scanf("%d",&b[i]);
                while(~scanf("%d %d",&s,&t))
                {
                    if(s==-1&&t==-1) break;
                    for(i = 1 ; i<=n ; i++)
                    {
                        for(j = 1 ; j <= n ;j++)
                            if(j!=s&&j!=t) dis[i][j] = ma[i][j]+b[j];
                        else dis[i][j] = ma[i][j];
                    }
                dijkstral(s,n);
                printf("From %d to %d :
    ",s,t);
                printf("Path: %d",s);
                int sta[2000],i=0,p = t;
                while(p!=s){
                    sta[i++] = p;
                    p = pre[p];
                }
                for(j = i -1; j>=0 ; j--)
                    printf("-->%d",sta[j]);
                printf("
    Total cost : %d
    
    ",d[t]);
                }
    
        }
        return 0;
    }
  • 相关阅读:
    重新理解js的执行环境和闭包
    给开发插上想象力的翅膀
    Vue源码的初始化以及数据驱动逻辑
    解析Vue源码之前
    前端模块化发展介绍和未来展望
    现代前端框架具备的特征分析及Vue、React对比
    始于Flux的单项数据流发展简单介绍
    用面向对象编程解决常见需求场景
    【Docker】之重启容器相关命令
    【Java】之获取CSV文件数据以及获取Excel文件数据
  • 原文地址:https://www.cnblogs.com/llei1573/p/3912892.html
Copyright © 2011-2022 走看看