• Aizu


    题意:/*你是某个岛国(ACM-ICPC Japan)上的一个苦逼程序员,
    你有一个当邮递员的好基友利腾桑遇到麻烦了:
    全岛有一些镇子通过水路和旱路相连,走水路必须要用船,在X处下船了船就停在X处。
    而且岛上只有一条船,下次想走水路还是得回到X处才行;
    两个镇子之间可能有两条以上的水路或旱路;
    邮递员必须按照清单上的镇子顺序送快递
    (镇子可能重复,并且对于重复的镇子不允许一次性处理,比如ABCB的话B一定要按顺序走两次才行)。*/

    思路:弗洛伊德求出弗洛伊德求出陆路,水路任意两点间的最短距离,然后动态规划求解。

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<vector>
    #include<set>
    #include<queue>
    #include<string>
    #include<algorithm>
    #define MAXSIZE 1005
    #define LL long long
    #define INF 0x3f3f3f
    using namespace std;
    
    int lmap[MAXSIZE][MAXSIZE],smap[MAXSIZE][MAXSIZE],dp[MAXSIZE][MAXSIZE],q[MAXSIZE],n,m;
    
    int solve()
    {
        for(int k=1;k<=n;k++) //弗洛伊德求出陆路,水路任意两点间的最短距离
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    lmap[i][j] = min(lmap[i][j],lmap[i][k]+lmap[k][j]);
                    smap[i][j] = min(smap[i][j],smap[i][k]+smap[k][j]);
                }
            }
        }
        dp[1][q[1]] = 0; //初始在第一个城市
        for(int i=1;i<=m;i++) //现在派送的城市
        {
            for(int j=1;j<=n;j++) //枚举船在那个城市
            {
                dp[i][j] = min(dp[i][j],dp[i-1][j]+lmap[q[i-1]][q[i]]);
                for(int k=1;k<=n;k++) //枚举把船停到那个城市
                {
                    dp[i][k] = min(dp[i][k],dp[i-1][j]+lmap[q[i-1]][j]+smap[j][k]+lmap[k][q[i]]);
                }
            }
        }
    
        int minn = INF;
        for(int i=1;i<=n;i++)
        {
            if(minn > dp[m][i])
                minn = dp[m][i];
        }
        return minn;
    }
    
    void Init()
    {
        for(int i=0;i<MAXSIZE;i++)
        {
            for(int j=0;j<MAXSIZE;j++)
            {
                if(i == j)
                {
                    //dp[i][j] = 0;
                    lmap[i][j] = 0;
                    smap[i][j] = 0;
                }
                else
                {
    
                    lmap[i][j] = INF;
                    smap[i][j] = INF;
                }
                dp[i][j] = INF;
            }
        }
    }
    
    int main()
    {
        char op[5];
        int u,v,w;
        while(scanf("%d%d",&n,&m),n+m)
        {
            Init();
            for(int i=1;i<=m;i++)
            {
                scanf("%d%d%d%s",&u,&v,&w,op);
                if(op[0] == 'L')
                {
                    lmap[u][v] = lmap[v][u] = min(lmap[u][v],w);
                }
    
                else
                {
                    smap[u][v] = smap[v][u] = min(smap[u][v],w);
                }
            }
    
            scanf("%d",&m);
            for(int i=1;i<=m;i++)
                scanf("%d",&q[i]);
    
            int ans = solve();
    
            printf("%d
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Xcode 10 关于 CocoaPods 安装失败的问题RuntimeError
    iOS 解决xcode设置全局断点后 执行视频播放时自动进入断点cxa_throw
    iOS swift String 换行显示
    iOS wkWebView点击链接无反应
    iOS swift跑马灯滚动可以点击
    iOS swift版本无限滚动轮播图
    iOS swift中比较模型数组是否相等
    iOS valueForKeyPath快速计算求和、平均值、最大、最小
    iOS 全屏播放网页视频退出后状态栏被隐藏
    vacabulary1
  • 原文地址:https://www.cnblogs.com/alan-W/p/7288457.html
Copyright © 2020-2023  润新知