AOJ 2200 Mr. Rito Post Office(Floyd+单调DP)

本文介绍了一道在线评测题目AOJ 2200的解决思路,该题要求求解在一张包含陆路和水路的图中,按照指定顺序访问一系列点所需的最短时间。利用Floyd算法预处理陆路和水路的最短路径,再通过动态规划求解最终答案。

 

【题目链接】 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2200

 

【题目大意】

  一张图中有陆路和水路,水路必须要有船才能走,当船开到x点时就会停在x点
  一开始人和船都在1点,问按给出顺序访问一些点需要的最短时间

 

【题解】

  利用floyd可以得出只走陆路和只走水路时两点间的最短路
  dp[i][j]表示走到了第i个需要访问的村庄,船停在j点的最短路,然后顺序dp更新状态即可

 

【代码】

#include <cstdio>
#include <algorithm>
#include <cstring> 
#define rep(i,n) for(int i=1;i<=n;i++)
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
int n,m,q,x,y,z,d[1010]; char c;
int dl[210][210],ds[210][210],dp[1010][210];
int main(){
    while(~scanf("%d%d",&n,&m),n+m){
        rep(i,n)rep(j,n)ds[i][j]=dl[i][j]=i==j?0:INF;
        rep(i,m){
            scanf("%d%d%d %c",&x,&y,&z,&c);
            if(c=='S')ds[x][y]=ds[y][x]=min(ds[x][y],z);
            else dl[x][y]=dl[y][x]=min(dl[x][y],z);
        }scanf("%d",&q);
        rep(i,q)scanf("%d",d+i);
        rep(k,n)rep(i,n)rep(j,n){
            ds[i][j]=min(ds[i][j],ds[i][k]+ds[k][j]);
            dl[i][j]=min(dl[i][j],dl[i][k]+dl[k][j]);
        }memset(dp,INF,sizeof(dp));
        dp[1][d[1]]=0;
        rep(i,q)rep(j,n){
            dp[i][j]=min(dp[i][j],dp[i-1][j]+dl[d[i-1]][d[i]]);
            rep(k,n)dp[i][k]=
                min((LL)dp[i][k],(LL)dp[i-1][j]+dl[d[i-1]][j]+ds[j][k]+dl[k][d[i]]);  
        }printf("%d\n",*min_element(dp[q],dp[q]+n+1));
    }return 0;
}

 

转载于:https://www.cnblogs.com/forever97/p/aoj2200.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值