快递

Time limit 8000 ms

Memory limit 131072 kB

Problem Description

你是某个岛国(ACM-ICPC Japan)上的一个苦逼程序员,你有一个当邮递员的好基友利腾桑遇到麻烦了:全岛有一些镇子通过水路和旱路相连,走水路必须要用船,在X处下船了船就停在X处。而且岛上只有一条船,下次想走水路还是得回到X处才行;两个镇子之间可能有两条以上的水路或旱路;邮递员必须按照清单上的镇子顺序送快递(镇子可能重复,并且对于重复的镇子不允许一次性处理,比如ABCB的话B一定要按顺序走两次才行)。

测试数据有多组:

N M

x1 y1 t1 sl1

x2 y2 t2 sl2

xM yM tM slM

R

z1 z2 … zR

N (2 ≤ N ≤ 200) 是镇子的数量,M (1 ≤ M ≤ 10000) 是旱路和水路合计的数量。从第2行到第M + 1行是路径的描述,路径连接xi yi两地,路径花费 ti (1 ≤ ti ≤ 1000)时间,sli 为L时表示是旱路,S时表示是水路。可能有两条及以上路径连接两个镇子,并且路径都是双向的。

M + 2行的R是利腾需要去的镇子的数量,M + 3是利腾需要去的镇子的编号。

初始状态利腾和船都在第一个镇子,且肯定有方法达到需要去的镇子。

测试数据为0 0的时候表示终止。

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


解题新的:

  1. 这个题主要考察的是一个动态规划,其实Floyd就是一个动态规划,然后数据量有点大,时间给的很大,整个解题的过程也非常的暴力。
  2. 首先要明白水路和陆路是不能够只建立一张图的,水路需要建立一张图,陆路需要建立一张图,然后分别跑Floyd,得到同一种路中每两点之间的最短距离,然后动态规划,得到水路陆路混合跑的最短距离。

//cost[i][j]表示从i点走到j点需要花费的最少时间

#include <stdio.h>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll; const int maxn = 1010;
const ll INF = 0x1f1f1f1f1f1f1f1f;
ll odr[maxn],cost[maxn][maxn],sea_path[maxn][maxn],land_path[maxn][maxn],n,m,w; void init() {
memset(cost,INF, sizeof(cost));
memset(sea_path,INF, sizeof(sea_path));
memset(land_path,INF, sizeof(land_path));
char s[5];
for(int i=0;i<m;i++) {
ll a,b,c;
scanf("%lld%lld%lld%s",&a,&b,&c,s);
if(s[0] == 'S')//建立两个图
sea_path[a][b] = sea_path[b][a] = min(sea_path[a][b],c);
else
land_path[a][b] = land_path[b][a] = min(land_path[a][b],c);
} scanf("%lld",&w);
for(int i=1;i<=w;i++)
scanf("%lld",&odr[i]);//将要走的地点给存起来 } void Floyd() {//用Floyd来预处理任意两点之间的最短距离
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) {
sea_path[i][j] = min(sea_path[i][j],sea_path[i][k]+sea_path[k][j]);
land_path[i][j] = min(land_path[i][j],land_path[i][k]+land_path[k][j]);
}
} void get_ans() {
for(int i=1;i<=n;i++)
sea_path[i][i] = land_path[i][i] = 0;//自身到自身时间花费为0
cost[1][odr[1]] = 0;
for(int i=1;i<=w;i++) {
for(int j=1;j<=n;j++) {
cost[i][j] = min(cost[i][j],cost[i-1][j]+land_path[odr[i-1]][odr[i]]);//假如走的是陆路
for(int k=1;k<=n;k++) {//枚举船停的位置
cost[i][k] = min(cost[i][k],cost[i-1][j]+land_path[odr[i-1]][j]+sea_path[j][k]+land_path[k][odr[i]]);//从i-1点回到船在的j点,然后开船到k,再从陆路k到i点
}
}
}
ll Min = 1e12;
for(int i=1;i<=n;i++)
Min = min(cost[w][i],Min);
printf("%lld\n",Min);
} int main() {
while(scanf("%lld%lld",&n,&m) && n+m) {
init();
Floyd();
get_ans();
}
return 0;
}

Aizu:2200-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. Aizu - 2200 Mr. Rito Post Office

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

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

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

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

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

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

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

  6. Mr. Rito Post Office

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

  7. 教你一招:解决安装或卸载office时 提示错误2503 2502 发生了内部错误

    问题重现: 解决办法:使用软件卸载工具 Uninstall Tool 3.5.1 中文破解版强制删除文件,非常暴力,完美解决. 解决过程一览: 工具下载地址: 软件卸载工具 Uninstall Too ...

  8. KMSpico软件下载:激活Windows系统和Office工具

    每次都为激活Windows系统 和 Microsoft Offilce 工具头疼,为此特意记录并分享一下激活工具. 上资源:https://pan.baidu.com/s/1kI5YpCO2aYl-r ...

  9. Aizu:0009- Prime Number

    Prime Number Time limit 1000 ms Memory limit 131072 kB Problem Description Write a program which rea ...

随机推荐

  1. tp3.2水印上传文件

    <html> <html lang="en"><head>    <meta charset="UTF-8">  ...

  2. [转]C#利用委托跨线程更新UI数据

    在使用C#的过程中,难免会用到多线程,而用多线程之后,线程如何与界面交互则是一个非常头疼的问题.其实不仅仅是界面,一般情况下,我们往往需要获得线程的一些信息来确定线程的状态.比较好的方式是用委托实现, ...

  3. [c/c++]判断一个字符串是不是UTF-8字符串

    #define CHECK_LENGTH 20       //检查是否为utf8编码时所检查的字符长度  int is_utf8_string(char *utf) { int length = s ...

  4. Java —异常

    异常简介 有异于常态,和正常情况不一样,有错误出现,阻止当前方法或作用域,称为异常. Java中的异常类都继承Throwable类,它有两个子类:Error和Exception.Error很少接触,主 ...

  5. 数据仓库是什么?OLTP和OLAP是什么?

    数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented).集成的(Integrate).相对稳定的(Non-Volatile).反映历史变化(Time Varian ...

  6. Spring Cloud学习路线

    学习本学习路线学习完,大家将会对微服务.Spring Cloud.Docker.Kubernetes有一个系统.全面的认识.通过学习,将能掌握相关的知识体系,并能够投入到项目实战中去. 本学习路线采用 ...

  7. 笨办法学Python(十八)

    习题 18: 命名.变量.代码.函数 标题包含的内容够多的吧?接下来我要教你“函数(function)”了!咚咚锵!说到函数,不一样的人会对它有不一样的理解和使用方法,不过我只会教你现在能用到的最简单 ...

  8. 创建React工程:React工程模板

    这是本人初学React做的学习笔记;讲的不是很深,只算是简单的进行介绍. 这是一个小系列.都是在同一个模板中搭建的,但是代码是不能正常执行的. >>index.js <!DOCTYP ...

  9. python中那个断言assert的优化

    Python Assert 为何不尽如人意# Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛出异常. Copy >>> assert ...

  10. 彩色图像直方图均衡(Histogram Equalization)

    直方图均衡(Histogram Equalization) 一般步骤: 1.统计直方图每个灰度级出现的次数(概率) 2.累计归一化的直方图 3.计算新的像素值 重要:彩色直方图均衡不能对RGB分别做再 ...