zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Java vs Python
    Compiled Language vs Scripting Language
    445. Add Two Numbers II
    213. House Robber II
    198. House Robber
    276. Paint Fence
    77. Combinations
    54. Spiral Matrix
    82. Remove Duplicates from Sorted List II
    80. Remove Duplicates from Sorted Array II
  • 原文地址:https://www.cnblogs.com/alan-W/p/7288457.html
Copyright © 2011-2022 走看看