Mr. Rito Post Office

Time Limit : 8 sec, Memory Limit : 65536 KB

Problem D: Mr. Rito Post Office

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

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

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

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

例えば,町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 题目含义及思路参考于hacks博主的博客,具体如下: 题意:全岛有一些镇子通过水路和旱路相连,走水路必须要用船,在X处下船了船就停在X处。而且岛上只有一条船,下次想走水路还是得回到X处才行;两个镇子之间可能有两条以上的水路或旱路;邮递员必须按照清单上的镇子顺序送快递(镇子可能重复,并且对于重复的镇子不允许一次性处理,比如ABCB的话B一定要按顺序走两次才行)。
思路:

最短路

先单独考虑只走水路或旱路的情况,用warshall_floyd求出任意两点间的最短路。

然后定义 dp[i][k] := 已经去了第i个镇子后,船停在第k个镇子里的状态下的最短路。

然后ijk三重循环更新dp,其中递推公式思路:

在推导ik的时候,定义一个中间状态j表示先从i-1走旱路到j,然后从j走水路去k,最后从k走旱路去i,于是就把船扔在了k。如果j==k的时候就不需要绕圈子了。

代码:
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 1e8 const int V_MAX =;
const int R_MAX =;
int dl[V_MAX][V_MAX];//旱路最短
int ds[V_MAX][V_MAX];//水路最短
int z[R_MAX];//存储要去的镇子
int dp[R_MAX][V_MAX];//邮递员去了第i个镇子,船停留在第k个镇子的最短路
int V;
int main() {
int M;while (cin >> V >> M&&V||M) {
for (int i = ;i < V;i++) {
for (int j = ;j < V;j++) {
if (i == j) { dl[i][j] = ; ds[i][j] = ; }
else { dl[i][j] = INF;ds[i][j] = INF; }/////!!!!!!!!!!!!!!不要越界
}
}
for (int i = ;i < M;i++) {
int x, y, t;char c;
cin >> x >> y>>t>>c;
x--;y--;////////!!!!!!!!!!!!!!!!!
if (c == 'L') {
dl[x][y] = min(dl[x][y], t);
dl[y][x] = dl[x][y];
}
else {
ds[x][y] = min(ds[x][y],t);
ds[y][x] = ds[x][y];
}
}
int R;
cin>> R;
for(int i = ;i < R;i++) {
cin >> z[i];
z[i]--;
}
//floyd算法:
for (int k = ;k < V;k++) {
for (int i = ;i < V;i++) {
for (int j = ;j < V;j++) {
dl[i][j] = min(dl[i][k] + dl[k][j], dl[i][j]);
ds[i][j] = min(ds[i][k] + ds[k][j], ds[i][j]);
}
}
}
//end of floyd,至此找到了镇子与镇子之间只走水路或只走旱路的最短距离
for (int i = ; i < R; ++i)
{
for (int j = ; j < V; ++j)
{
dp[i][j] = INF;
}
}
for (int i = ;i < V;i++) {//dp意义:代表去过第i个镇子(i不是代表编号,只是邮递员去的第i个镇子),船在第k个镇子的所走的最短路程(当前的邮递员在第i个镇子)
dp[][i] = ds[z[]][i]+dl[i][z[]];
}
for (int i = ;i < R;i++) {
for (int j = ;j < V;j++) {
for (int k = ;k < V;k++) {
if (j != k) {
dp[i][k] = min(dp[i][k], dp[i - ][j] + dl[z[i - ]][j] + ds[j][k] + dl[k][z[i]]);
}
else{//说明不用走水路
dp[i][k] = min(dp[i][k],dp[i-][k]+dl[z[i-]][z[i]]);
}
}
}
}
cout << *min_element(dp[R-],dp[R-]+V) << endl;
}
return ;
}

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

  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 (floyd+DP)

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

  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. 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. 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. 精品教程--IOS零基础开发环境搭建

    下载源码 技术要点: 1. 启动XCODE开始开发 2. IOS项目文件结构分析 3. 添加视图label组件 4. 程序的入口以及启动流程 5. 源码详细的中文注释 ...... 详细介绍: 1. ...

  2. IOS开发UI篇--使用CAShapeLayer实现复杂的View的遮罩效果

    一.案例演示 最近在整理一个聊天的项目的时候,发送图片的时候,会有一个三角的指向效果,指向这张图片的发送者.服务端返回给我们的图片只是一张矩形的图片,我们如何把一张矩形的图片或者View,加上一层自定 ...

  3. iOS网络监测如何区分2、3、4G?

    你可以在Github下载这个Demo 首先,引入系统的Reachability类,不知道怎么引入的话,在Xcode,按下shift+command+0,搜索Reachability,看到图中所选的工程 ...

  4. 1.6.3 Uploading Data with Solr Cell using Apache Tika

    1. Uploading Data with Solr Cell using Apache Tika solr使用Apache Tika工程的代码提供了一个框架,用于合并所有不同格式的文件解析器为so ...

  5. Socket 使用笔记与注意事项(一)

    SocketAsyncEventArgs 1.该参数可以重复使用. 2.SocketAsyncEventArgs 的事件执行触发之后可以使用. 3.SocketAsyncEventArgs 的事件还在 ...

  6. Android小项目之十 应用程序更新的签名问题

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...

  7. Tomcat内存设置详解

    Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在 ...

  8. PHP trim()函数的一些用法

    string trim ( string $str [, string $charlist ] ) - 去除字符串首尾处的空白字符(或者其他字符) trim()函数当第二个参数为空时,默认去掉空格.制 ...

  9. linux-启动停止重启shell 简单shell示例

    停止: #!/bin/bashpid=`ps -ef|grep /opt/lampp|grep -v grep|awk '{print $2}'|wc -l`b=0if [ $pid -gt $b ] ...

  10. angularJs中将字符串转换为HTML格式

    首先定义一个filter: .filter( 'to_trusted', ['$sce', function ($sce) { return function (text) { return $sce ...