题意:
你是某个岛国(ACM-ICPC Japan )上的一个苦逼程序员,你有一个当邮递员的好基友利腾桑遇到麻烦了:全岛有一些镇子通过水路和旱路相连,走水路必须要用船,在X处下船了船就停在X处。而且岛上只有一条船,下次想走水路还是得回到X处才行;两个镇子之间可能有两条以上的水路或旱路;邮递员必须按照清单上的镇子顺序送快递(镇子可能重复,并且对于重复的镇子不允许一次性处理,比如ABCB的话B —定要按顺序走两次才行)。
测试数据有多组:
N M
xl yl tl sll
x2 y2 t2 sl2
XM yM tM SIM
R
Zl Z2 ... ZR
N (2 <= N <= 200)是镇子的数星,M (1 <= M <= 10000)是旱路和水路合计的数量。
从第2行到第M+1行是路径的描述,路径连接xi yi两地,路径花费ti (1 s ti s 1000)时间,sli为L时表示是旱路,S时表示是水路。
可能有两条及以上路径连接两个镇子,并且路径都是双向的。
M + 2行的R是利腾需要去的镇子的数量,M + 3是利腾需要去的镇子的编号
初始状态利腾和船都在第一个镇子,且肯定有方法达到需要去的镇子。
测试数据为0 0的时候表示终止。

样例输入

3 3
1 2 5 L
1 2 7 S
2 3 11 S
3
1 2 3
5 5
1 2 15 L
2 3 10 L
4 5 7 L
1 3 30 S
3 4 100 S
5
1 3 5 4 1
0 0

样例输出

18

269

分析

这道dp题还是比较容易想的,不过有一个坑人的地方!

因为要转移的参考量,一是当前位置,二是船的位置,那么设dp[i][j]为走到第i个城市,船停在j

那么状态转移方程就是dp[i][j]=min(dp[i-1][k]+l[id[i-1]][k]+s[k][j]+l[j][id[i]],dp[i][j]);

但是j==k的时候,不要去移船!dp[i][j]=min(dp[i-1][k]+l[id[i-1][id[i]],dp[i][j]);

代码

 #include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define RG register ll
#define rep(i,a,b) for(RG i=a;i<=b;++i)
#define per(i,a,b) for(RG i=a;i>=b;--i)
#define ll long long
#define inf (1<<29)
#define maxn 205
#define maxr 1005
using namespace std;
ll n,m,cnt;
ll l[maxn][maxn],s[maxn][maxn],id[maxr],dp[maxr][maxn];
inline ll read()
{
ll x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void DP()
{
memset(dp,,sizeof(dp));
dp[][id[]]=;
rep(i,,cnt)
rep(j,,n)
rep(k,,n)
{
if(j!=k) //
dp[i][j]=min(dp[i-][k]+l[id[i-]][k]+s[k][j]+l[j][id[i]],dp[i][j]);
else
dp[i][j]=min(dp[i-][k]+l[id[i-]][id[i]],dp[i][j]);
}
ll mn=inf;
rep(i,,n) mn=min(mn,dp[cnt][i]);
cout<<mn<<endl;
} int main()
{
char opt;
while()
{
n=read(),m=read();
if(!n) return ;
rep(i,,n)rep(j,,n) l[i][j]=s[i][j]=inf;
rep(i,,n) l[i][i]=s[i][i]=;
for(RG i=,a,b,c;i<=m;i++)
{
a=read(),b=read(),c=read();opt=getchar();
if(opt=='L') l[a][b]=l[b][a]=c;
else s[a][b]=s[b][a]=c;
}
rep(k,,n)rep(i,,n)rep(j,,n) l[i][j]=min(l[i][j],l[i][k]+l[k][j]),s[i][j]=min(s[i][j],s[i][k]+s[k][j]);
cnt=read();
rep(i,,cnt) id[i]=read();
DP();
}
return ;
}

Mr. Rito Post Office [Aizu-2200] [图论] [DP]的更多相关文章

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

    [题目链接] http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2200 [题目大意] 一张图中有陆路和水路,水路必须要有船才能走,当船 ...

  2. AOJ 2200 Mr. Rito Post Office

    Mr. Rito Post Office Time Limit : 8 sec, Memory Limit : 65536 KB Problem D: Mr. Rito Post Office あなた ...

  3. Aizu - 2200 Mr. Rito Post Office

    题意:/*你是某个岛国(ACM-ICPC Japan)上的一个苦逼程序员,你有一个当邮递员的好基友利腾桑遇到麻烦了:全岛有一些镇子通过水路和旱路相连,走水路必须要用船,在X处下船了船就停在X处.而且岛 ...

  4. AOJ 2200 Mr. Rito Post Office (floyd+DP)

    题意: 快递到了:你是某个岛国(ACM-ICPC Japan)上的一个苦逼程序员,你有一个当邮递员的好基友利腾桑遇到麻烦了:全岛有一些镇子通过水路和旱路相连,走水路必须要用船,在X处下船了船就停在X处 ...

  5. Mr. Rito Post Office

    あなたは離島の郵便局に勤めるプログラマである.あなたの住んでいる地域は,複数の島々からなる.各島には一つ以上の港町がある.それらに加えて他の町や村があるかもしない.ある島から別の島に向かうためには船を ...

  6. Aizu:2200-Mr. Rito Post Office

    快递 Time limit 8000 ms Memory limit 131072 kB Problem Description 你是某个岛国(ACM-ICPC Japan)上的一个苦逼程序员,你有一 ...

  7. 图论+dp poj 1112 Team Them Up!

    题目链接: http://poj.org/problem?id=1112 题目大意: 有编号为1~n的n个人,给出每个人认识的人的编号,注意A认识B,B不一定认识A,让你将所有的人分成两组,要求每组的 ...

  8. 洛谷P3953 逛公园 [noip2017] 图论+dp

    正解:图论(最短路)+dp(记忆化搜索) 解题报告: 这题真的是个好东西! 做了这题我才发现我的dij一直是错的...但是我以前用dij做的题居然都A了?什么玄学事件啊...我哭了TT 不过其实感觉还 ...

  9. FZUOJ Problem 2200 cleaning DP

    Problem 2200 cleaning  Problem Description N个人围成一圈在讨论大扫除的事情,需要选出K个人.但是每个人与他距离为2的人存在矛盾,所以这K个人中任意两个人的距 ...

随机推荐

  1. Ubuntu安装TensorFlow

    使用清华大学开源软件镜像站:https://mirrors.tuna.tsinghua.edu.cn/ 下载. 在主界面右侧找到[相关链接]->[使用帮助],然后在出现的页面左侧找到Tensor ...

  2. haproxy admin_stats端口启动错误解决

    /var/log/message里的错误消息大概如下: Feb 13 09:32:50 cluster-node2 haproxy-systemd-wrapper: [ALERT] 043/09325 ...

  3. C#学习-字段

    字段的定义由3部分组成,访问修饰符.字段的类型和字段的名称.以下是 public class Person { //姓名,类型为字符串类型 private string name; //年龄,类型为i ...

  4. SignalRMvc的简单例子

    1.介绍 我们知道传统的http采用的是“拉模型”,也就是每次请求,每次断开这种短请求模式,这种场景下,client是老大,server就像一个小乌龟任人摆布,很显然,只有一方主动,这事情就没那么完美 ...

  5. [转] Mongoose 参考手册

    Mongoose 参考手册 标签(空格分隔): MongoDB Mongoose 是什么? 一般我们不直接用MongoDB的函数来操作MongoDB数据库 Mongose就是一套操作MongoDB数据 ...

  6. Java-把日期字符串转换成另一种格式的日期字符串

    package com.example.demo.utils; import java.text.ParseException; import java.text.SimpleDateFormat; ...

  7. .NET Framework反射总结

    概述 程序集的反射以及动态的创建类对象,是自动化编程常用的到知识原理,比如插件编程.模板设计模式,都可以采用发射机制动态的去创建实例化对象,实现类的动态加载.这里简单总结下,常用到的Framework ...

  8. nginx 正则及rewrite常用规则实例

    一.正则表达式匹配,其中:* ~ 为区分大小写匹配* ~* 为不区分大小写匹配* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配二.文件及目录匹配,其中:* -f和!-f用来判断是否存在文件* ...

  9. Office 2010 word无法创建工作文件 请检查临时环境变量 的解决办法

    Office 2010 word无法创建工作文件 请检查临时环境变量 的解决办法 http://hi.baidu.com/netshen/item/207fd935d452e0e9df2221c9 如 ...

  10. ionic2集成sdk后,连接超时的问题

    这几天在测试app的时候,偶尔会发现集成的好视通sdk在进入会议室的时候出现连接超时的问题,一直卡在‘正在获取版本信息’的页面,经反复测试后这种现象主要出现在点击返回按钮和退出登录按钮的时候会出现,也 ...