Mr. Rito Post Office [Aizu-2200] [图论] [DP]
题意:
你是某个岛国(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]的更多相关文章
- AOJ 2200 Mr. Rito Post Office(Floyd+单调DP)
[题目链接] http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2200 [题目大意] 一张图中有陆路和水路,水路必须要有船才能走,当船 ...
- AOJ 2200 Mr. Rito Post Office
Mr. Rito Post Office Time Limit : 8 sec, Memory Limit : 65536 KB Problem D: Mr. Rito Post Office あなた ...
- Aizu - 2200 Mr. Rito Post Office
题意:/*你是某个岛国(ACM-ICPC Japan)上的一个苦逼程序员,你有一个当邮递员的好基友利腾桑遇到麻烦了:全岛有一些镇子通过水路和旱路相连,走水路必须要用船,在X处下船了船就停在X处.而且岛 ...
- AOJ 2200 Mr. Rito Post Office (floyd+DP)
题意: 快递到了:你是某个岛国(ACM-ICPC Japan)上的一个苦逼程序员,你有一个当邮递员的好基友利腾桑遇到麻烦了:全岛有一些镇子通过水路和旱路相连,走水路必须要用船,在X处下船了船就停在X处 ...
- Mr. Rito Post Office
あなたは離島の郵便局に勤めるプログラマである.あなたの住んでいる地域は,複数の島々からなる.各島には一つ以上の港町がある.それらに加えて他の町や村があるかもしない.ある島から別の島に向かうためには船を ...
- Aizu:2200-Mr. Rito Post Office
快递 Time limit 8000 ms Memory limit 131072 kB Problem Description 你是某个岛国(ACM-ICPC Japan)上的一个苦逼程序员,你有一 ...
- 图论+dp poj 1112 Team Them Up!
题目链接: http://poj.org/problem?id=1112 题目大意: 有编号为1~n的n个人,给出每个人认识的人的编号,注意A认识B,B不一定认识A,让你将所有的人分成两组,要求每组的 ...
- 洛谷P3953 逛公园 [noip2017] 图论+dp
正解:图论(最短路)+dp(记忆化搜索) 解题报告: 这题真的是个好东西! 做了这题我才发现我的dij一直是错的...但是我以前用dij做的题居然都A了?什么玄学事件啊...我哭了TT 不过其实感觉还 ...
- FZUOJ Problem 2200 cleaning DP
Problem 2200 cleaning Problem Description N个人围成一圈在讨论大扫除的事情,需要选出K个人.但是每个人与他距离为2的人存在矛盾,所以这K个人中任意两个人的距 ...
随机推荐
- SHELL打印两个日期之间的日期
SHELL打印两个日期之间的日期 [root@umout shell]# cat date_to_date.sh THIS_PATH=$(cd `dirname $0`;) cd $THIS_PATH ...
- .Net(C#)用正则表达式清除HTML标签(包括script和style),保留纯本文(UEdit中编写的内容上传到数据库)
去官网下载,本Demo用的MVC模式 下载地址:http://ueditor.baidu.com/website/download.html 加入文件夹中的结构: 引入了函数公式的图标: @{ Vie ...
- Java第三阶段学习(七、线程池、多线程)
一.线程池 1.概念: 线程池,其实就是一个容纳多个线程的容器,其中的线程可以重复使用,省去了频繁创建线程对象的过程,无需反复创建线程而消耗过多资源,是JDK1.5以后出现的. 2.使用线程池的方式- ...
- Windows无法自动将IP协议堆栈绑定到网络适配器 的解决办法
实验室的台式机在升级驱动后上不了网了,有线网卡驱动卸载后重装了,还是不行,通过Windows诊断发现“Windows 无法自动将 IP 协议堆栈绑定到网络适配器的解决办法”. 解决办法: 打开“控制面 ...
- net core体系-web应用程序-2项目简单案例
阅读目录 NO1 留言板(mysql的使用) NO2 聊天室(WebSocket的使用) NO3 找工作(AngleSharp的使用) 部署多个站点 一些其它的细节 部署阿里云 mysql的客户端 ...
- Python学习(二) —— 运算符
一:Python的编码 python2的默认编码是ascii码,而python3的默认编码是utf-8 ASCII(American Standard Code for Information Int ...
- Python 事件驱动与异步IO
一.事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定.它的特点是包含一个事件循环,当外部事件发生时使用回调机制来出发相应的处理.另外两种常见的编程范式是(单线程)同步以及多线程编程. 1. ...
- 爬虫之 beautifusoup4
1. 使用方法 2.解析器 3. 详细用法 4. find_all方法 5. 遍历文档树
- tp5参数绑定
关闭路由后的普通模式任然可以通过操作方法的参数绑定.控制器和空操作等特性实现url地址的简化 参数绑定(默认是按名称成对解析,): namespace app\index\Controller; cl ...
- js根据银行卡号进行判断属于哪个银行并返回银行卡类型
在做绑定银行卡,输入银行卡的时候,产品有这么一个需求,需要用户输入银行卡号的时候,显示对应的银行卡名称及简称.于是苦苦寻觅,终于找到了支付宝的开放API,银行卡校验接口 https://ccdcapi ...