あなたは離島の郵便局に勤めるプログラマである.あなたの住んでいる地域は,複数の島々からなる.各島には一つ以上の港町がある.それらに加えて他の町や村があるかもしない.ある島から別の島に向かうためには船を使わなければならない.一つの島の中を回るには陸路が使えるが,海路を利用した方が速いこともある.

近年行われた郵便局の民営化をきっかけに,経費削減に向けて郵便配達員の人員整理が全国的に行われた.離島の郵便局もその例外ではなく,結果として郵便配達員は利藤さんただ一人となってしまった.その郵便局が集配を担当する地域は非常に広いため,一人で集配するのは大変な作業である.なので,どのようにすれば効率的に集配を行えるのか,利藤さんがあなたに助けを求めてきた.

あなたの仕事は,利藤さんがたどるべき町や村の集配順序が与えられたときに,最短巡回経路を求めるプログラムを書くことである.

利藤さんは,決して指定された順序以外で集配業務を行うことができない.しかし,ある町や村から別の町や村へ移動する際に,他の町や村を経由して移動することは許可されている.また,利藤さんは島々を巡るための一隻の船を持っている.

例えば,町A,町B,村Cという集配順序が与えられた場合,町Aから町Bへ向かう際にどの町や村を経由してもかまわない.このとき,村Cを経由しても構わないが,集配順序を守るためには,一度町Bに行って集配をおこなってから,改めて村Cを訪れて集配をおこなわなければならない.また,町Aから海路を用いて町Bに向かい,町Bから陸路を用いて村Cに向かった場合,船を町Bに置いたままになる.したがって,次に海路を使いたい場合は町Bに戻る必要がある.

一つの町や村において複数回集配をしなければならない場合もある.たとえば,町A,村B,町C,村Bという集配順序が与えられるかもしれない.このとき,町Aから村Bをたどらずに町Cに向かった場合は,町Cでいきなり集配をおこなうことはできない.最初の村Bでの集配が終わっていないからである.町Cで集配を済ませた後で村Bを訪れて集配しても,一回目の村Bの集配を終わらせたことにはならない.

利藤さんは,はじめに必ずある港町に船とともにいる.利藤さんはベテランであるため,移動時間以外の集配作業にかかる時間は無視してよい.また,最後の町または村での集配業務が完了するまでの時間だけが問題であり,船をもとの位置に戻して郵便局に帰るまでの時間は考慮しなくてよい.

Input

入力は複数のデータセットから構成される.各データセットの形式は次に示すとおりである.

N M 
x1 y1 t1 sl1 
x2 y2 t2 sl2 
... 
xM yM tM slM 
R 
z1 z2 ... zR

データセットの中の入力項目は,すべて非負の整数である.行中の入力項目の区切りは空白 1 個である.

最初の行は,陸路及び海路網の大きさを規定する.

N (2 ≤ N ≤ 200) は,町または村の数である. それぞれの町または村には,1 から N までの固有の番号を割り当てる. M (1 ≤ M ≤ 10000) は,陸路と海路の合計本数である.

2 行目から 1 + M 行目は,陸路または海路の記述である. xi と yi (1 ≤ xiyi ≤ N) は両端の町または村の番号を表す. ti (1 ≤ ti ≤ 1000) はその陸路または海路の移動時間を表す. sli は ‘L’ または ‘S’ のいずれかであり,Lは陸路を,Sは海路をそれぞれ表す.

ある2つの町や村を直接結ぶ陸路または海路が2本以上存在することがある. それぞれの陸路または海路は双方向であり,すなわちどちらの向きにも移動できる.

M + 2 行目の R (1 ≤ R ≤ 1000)は,利藤さんが担当する集配先の数を表す. M + 3 行目には,集配先の町や村の番号 zi (1 ≤ zi ≤ N) が集配順に R 個並んでいる.

初期状態では利藤さんと船はともに港町 z1 に存在する. 初期状態から集配先の町や村へは,必ず何らかの方法で移動することができる.

入力の終わりは,空白で区切られた2つの0を含む1行で示される.

Output

入力の各データセットに対して,与えられた集配順序で利藤さんが町と村を巡回するために必要な最短移動時間を求め,1行に出力せよ.

Sample Input

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

Output for the Sample Input

18
269 题解:
  首先,我们发现每次询问都只会有最多跟换两次道路,因为如果要更换多次,那么我们必须原路返回,或者走环绕回去,这样的话在一次询问中一定是没有只换两次或者优秀的。
  那么这个题目就变得可以dp了,那么状态也变得十分显然了,因为要一个n^3的算法,那么肯定状态是两维的,考虑记那两个量呢?然而题目一个才两个限制量——第几个询问和船在哪里,那么就可以设dp[i][j]表示处理完前i个询问,然后船丢到j节点的方案数。
  那么转移就根据那个性质,枚举两个断点就可以了,注意要特判两个断点相等的情况就可以了。 代码:(wa了,但思路没有问题,pai了2000多组极限数据没有wa)。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#define MAXN 220
#define ll long long
using namespace std;
int n,m,r;
ll mp[][][],dis[][][],dp[][],inf;
int id[]; void pre(){
memset(dis,/,sizeof(dis));
for(int i=;i<=n;i++)
for(int j=;j<=n;j++) dis[i][j][]=mp[i][j][],dis[i][j][]=mp[i][j][];
for(int i=;i<=n;i++) dis[i][i][]=dis[i][i][]=;
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
if(i==j||j==k||k==i) continue;
dis[i][j][]=min(dis[i][j][],dis[i][k][]+dis[k][j][]);
dis[i][j][]=min(dis[i][j][],dis[i][k][]+dis[k][j][]);
}
} void DP(){
memset(dp,/,sizeof(dp));inf=dp[][];
dp[][]=;
for(int i=;i<=r;i++){
for(int k=;k<=n;k++){
int x=id[i-],y=id[i];
dp[i][k]=min(dp[i][k],dp[i-][k]+dis[x][y][]);
for(int j=;j<=n;j++){
if(dp[i-][j]==inf) continue;
if(x==y) dp[i][k]=dp[i-][k];
else dp[i][k]=min(dp[i][k],dp[i-][j]+dis[x][j][]+dis[j][k][]+dis[k][y][]);
}
}
}
} int main()
{
while(){
memset(mp,/,sizeof(mp));
scanf("%d%d",&n,&m);
if(!n&&!m) break;
for(int i=;i<=m;i++){
int x,y,z;char c;
scanf("%d%d%d%c%c",&x,&y,&z,&c,&c);
if(c=='L') mp[x][y][]=min(mp[x][y][],(ll)z),mp[y][x][]=min(mp[y][x][],(ll)z);
else mp[x][y][]=min(mp[x][y][],(ll)z),mp[y][x][]=min(mp[y][x][],(ll)z);
}
pre();
scanf("%d",&r);
memset(id,,sizeof(id));
id[]=;
for(int i=;i<=r;i++) scanf("%d",&id[i]);
DP();
ll ans=inf;
for(int i=;i<=n;i++) ans=min(ans,dp[r][i]);
printf("%lld\n",ans);
}
return ;
}

Mr. Rito Post Office的更多相关文章

  1. AOJ 2200 Mr. Rito Post Office

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

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

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

  3. Aizu - 2200 Mr. Rito Post Office

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

  4. Mr. Rito Post Office [Aizu-2200] [图论] [DP]

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

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

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

  6. Aizu:2200-Mr. Rito Post Office

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

  7. ProgrammingContestChallengeBook

    POJ 1852 Ants POJ 2386 Lake Counting POJ 1979 Red and Black AOJ 0118 Property Distribution AOJ 0333 ...

  8. Aizu-2200-floyd+dp

    Mr. Rito Post Office 你是一个为远程邮局邮局工作的程序员.你住的地区由几个岛屿组成.每个岛屿都有一个或多个港口城镇.除此之外,还有其他城镇和村庄.为了从一个岛到另一个岛,你必须使用 ...

  9. 大数据python词频统计之hdfs分发-cacheFile

    -cacheFile 分发,文件事先上传至Hdfs上,分发的是一个文件 1.找一篇文章The_Man_of_Property.txt: He was proud of him! He could no ...

随机推荐

  1. I don't Blame You that You don't Understand Me

    I don't Blame You that You don't Understand Me Every one has a dead corner in himself, with no entry ...

  2. 新手学习FFmpeg - 通过API完成filter-complex功能

    本篇尝试通过API实现Filter Graph功能. 源码请参看 https://andy-zhangtao.github.io/ffmpeg-examples/ FFmpeg提供了很多实用且强大的滤 ...

  3. Golang 入门系列(十五)如何理解go的并发?

    前面已经讲过很多Golang系列知识,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/category/1275863.html, 接下来要说的 ...

  4. 一步步到IOC

    一段代码 class Program { static void Main(string[] args) { var shop=new Shop(); shop.Add(); shop.Delete( ...

  5. Linux 笔记 - 第十九章 配置 Squid 正向代理和反向代理服务

    一.简介 Squid 是一个高性能的代理缓存服务器,对应中文的乌贼,鱿鱼的意思.Squid 支持 FTP,gopher 和 HTTP 协议.和一般的代理缓存软件不同,Squid 用一个单独的,非模块化 ...

  6. C++基础之顺序容器

    顺序容器简介: 顺序容器类型 描述 vector 可变大小数组,支持快速访问,在尾部之外的地方插入或删除时可能很慢 deque 双端队列.支持快速访问,在头尾插入删除会很快. list 双向列表.只支 ...

  7. DefaultSerializer requires a Serializable payload but received an object of type [model.Admin]

    一.问题描述:   在用redis做二级缓存时,出现如下异常   DefaultSerializer requires a Serializable payload but received an o ...

  8. C++进程间通讯方式

    1.剪切板模式. 在MFC里新建两个文本框和两个按钮,点击发送按钮相当于复制文本框1的内容,点击接收按钮相当于粘贴到文本框2内: 发送和接收按钮处功能实现如下: void CClipboard2Dlg ...

  9. MySQL数据库忘记密码怎么办?

    忘记MySQL数据库密码就进不去数据库,也就无法修改密码,解决方法如下: 1:打开cmd命令符,先关闭正在运行的数据库,输入如下命令: 2:打开mysql.exe和mysqld.exe所在的文件夹,复 ...

  10. 引用极光jar包之后出现控制台日志打印不出来的问题。解决!

    由于极光的jar包中引用的有log4j,项目本身也引用有log4j,如果版本有冲突,则会出现控制台日志记录打印不出来的现象.解决:引用极光jar包的时候,排除log4j. <dependency ...