Aizu-2200-floyd+dp

    

Mr. Rito Post Office

  你是一个为远程邮局邮局工作的程序员。你住的地区由几个岛屿组成。每个岛屿都有一个或多个港口城镇。除此之外,还有其他城镇和村庄。为了从一个岛到另一个岛,你必须使用一艘船。陆地道路可用于绕过一个岛屿,但使用海路可能会更快。

随着近年来邮局的私有化,邮政派遣员工的人事安排在全国范围内进行,以减少开支。远程邮局的邮局也不例外,因此,只有托伊先生成为邮差。由于邮局负责收集和交付的区域非常广泛,因此由一个人收集和分发是一项艰巨的工作。所以,Toi先生问你如何有效地做到这一点。

你的工作是编写一个程序,当Tobi先生获得城镇和村庄的接送订单时,可以找到最短路径。

Toi先生将永远无法按规定的顺序进行收集和交付工作。但是,从一个城镇或村庄迁移到另一个城镇或村庄时,可以通过其他城镇和村庄。此外,Toji先生还有一艘船绕着岛屿转。

例如,考虑到A镇的选择和交付顺序,B镇,C村,任何城镇或村庄都可以从A镇到B镇。在这个时候,但它可能是通过村C,以保护集散顺序,进行集散去一次B镇后,必须进行再次集散访村C.另外,如果您从A镇乘船前往B镇,然后使用陆路从B镇前往C村,则您将离开B镇。因此,如果你想下一次使用大海,你需要返回B镇。

在某些情况下,有必要收集和分发到多个城镇和村庄。例如,可以给出A镇,B村,C镇,B村的收集订单。此时,如果您在没有从A镇的B村追踪的情况下前往C镇,则您不能在城镇C拣货并突然出货。这是因为第一个B村的接送并没有结束。即使集散走访了B村完成了镇C中的收集和交付后,并不意味着结束了收集和第一轮村B的交付

Toji先生在开始时在某个港口城市有一艘船。由于Toi先生是一名资深人士,您可以忽略除旅行时间之外的收集和交付工作所需的时间。此外,它是唯一的一次,直到在城镇或村庄结束的集散作业完成的问题,去邮局船返回到原来位置的时间可能不会考虑。

输入

输入由多个数据集组成。每个数据集的格式如下。

N M
x 1 y 1 t 1 sl 1
x 2 y 2 t 2 sl 2
...
xM y M t M slM
[R
z1 z2 ... zR
数据集中的所有输入项都是非负整数。该行中输入项目的分隔符是一个空格。

第一行指定陆地和海洋网络的大小。

N(2≤N≤200)是城镇或村庄的数量。每个城镇或村庄都分配一个从1到N的唯一编号。 M(1≤M≤10000)是陆地和海洋的总数。

第1 + M行的第二行是对陆地或海路的描述。 xi和yi(1≤xi,yi≤N)表示两端的城镇或村庄的数量。 ti(1≤ti≤1000)表示陆地或海路的行程时间。 sli是‘L‘或‘S‘,L是陆路,S是海路。

可能有两个或更多直接连接两个城镇和村庄的陆路或海路。每条陆地或海路都是双向的,即它可以向任何方向移动。

M + 2线上的R(1≤R≤1000)表示Toji先生处理的收集目的地和递送目的地的数量。 M + 3行,收集和城镇和数字字(1≤滋≤N)的村庄的传送目的地设置r个在收集和传递顺序。

在最初的状态下,Toji先生和这艘船都位于港口城镇z1。从最初的状态,你总是可以以某种方式移动到你选择和交付的城镇和村庄。

输入的结尾由包含由空白分隔的两个零的单行表示。

产量

对于每个输入数据集,找出Toji先生在给定的取件订单中在城镇和村庄周围旅行所需的最短行程时间,并将其输出到一条线上。

示例输入

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

1 3 5 4 1
0 0
样本输入的输出

18
269

    题目方程很好推出来,f[i][j]表示现在处于第i个快递点而船在j点时的最小花费,预处理出来纯陆地最短路和纯水路最短路,由于游历的顺序固定所以第i个点直接向第i+1个转移即可。

    一直WA的原因,一是数组开小了,最多游历1000个点并不一定是200,可能一个点多次。。。还有我的floyd写错了。。循环变量反了。。最后inf设置的不合理貌似中间爆了,吃完饭重新写才A。

    

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 LL f[1005][205],e1[205][205],e2[205][205],inf;
 5 int a[1005];
 6 int main(){
 7     int n,m,i,j,k,u,r,v;
 8     char str[5];
 9     LL w;
10     while(cin>>n>>m){
11         if(n==0&&m==0) break;
12         memset(e1,0x1,sizeof(e1));
13         memset(e2,0x1,sizeof(e2));
14         memset(f,0x1,sizeof(f));
15         for(i=1;i<=n;++i)e1[i][i]=e2[i][i]=0;
16         inf=f[0][0];
17         while(m--)
18         {
19         scanf("%d%d%lld",&u,&v,&w);
20         scanf("%s",str);
21         if(str[0]==‘L‘){
22             e1[u][v]=e1[v][u]=min(e1[u][v],w);
23         }
24         else{
25             e2[u][v]=e2[v][u]=min(e2[u][v],w);
26         }
27         }
28         for(k=1;k<=n;++k){
29             for(i=1;i<=n;++i){
30                 for(j=1;j<=n;++j){
31                     e1[i][j]=min(e1[i][j],e1[i][k]+e1[k][j]);
32                     e2[i][j]=min(e2[i][j],e2[i][k]+e2[k][j]);
33                 }
34             }
35         }
36         scanf("%d",&r);
37         for(i=1;i<=r;++i) scanf("%d",a+i);
38         for(i=1;i<=n;++i) f[1][i]=min(f[1][i],
39         e2[a[1]][i]+e1[i][a[1]]);
40
41         for(i=1;i<r;++i){
42             for(j=1;j<=n;++j){
43                 if(f[i][j]!=inf){
44                     f[i+1][j]=min(f[i+1][j],f[i][j]+e1[a[i]][a[i+1]]);
45                     for(k=1;k<=n;++k){
46                         f[i+1][k]=min(f[i+1][k],f[i][j]+e2[j][k]+e1[a[i]][j]+e1[k][a[i+1]]);
47                     }
48                 }
49             }
50         }
51
52         LL ans=inf;
53         for(i=1;i<=n;++i)ans=min(ans,f[r][i]);
54         cout<<ans<<endl;
55     }
56     return 0;
57 }

原文地址:https://www.cnblogs.com/zzqc/p/9052888.html

时间: 2024-08-29 21:34:59

Aizu-2200-floyd+dp的相关文章

UVA10269 Adventure of Super Mario(Floyd+DP)

UVA10269 Adventure of Super Mario(Floyd+DP) After rescuing the beautiful princess, Super Mario needs to find a way home -- with the princess of course :-) He's very familiar with the 'Super Mario World', so he doesn't need a map, he only needs the be

HDU2833 WuKong(floyd + dp)经典

WuKong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1429    Accepted Submission(s): 517 Problem Description Liyuan wanted to rewrite the famous book "Journey to the West" ("Xi You

zoj 1232 Adventure of Super Mario (Floyd+dp)

Adventure of Super Mario Time Limit: 2 Seconds      Memory Limit: 65536 KB After rescuing the beautiful princess, Super Mario needs to find a way home -- with the princess of course :-) He's very familiar with the 'Super Mario World', so he doesn't n

codeforces 295B B. Greg and Graph(floyd+dp)

题目链接: codeforces 295B 题目大意: 给出n个点的完全有权有向图,每次删去一个点,求每次操作前整张图各个点的最短路之和. 题目分析: 首先删边对于我们来说是不好做的,所以我们想到了通过加点的方式逆向地做,那么加点怎么做呢? 其实就是一个我们很熟悉的算法:floyd,因为我们通常用的都是它的简化版本,所以可能很多人并不理解它的确切的思想. 在介绍这道题的具体解法之前,我先解释一下floyd,可能之后的问题就迎刃而解了. 首先floyd其实是动态规划,没有省略时的状态是这样定义的.

(floyd+DP) zoj 1232

Adventure of Super Mario Time Limit: 2 Seconds      Memory Limit: 65536 KB After rescuing the beautiful princess, Super Mario needs to find a way home -- with the princess of course :-) He's very familiar with the 'Super Mario World', so he doesn't n

(floyd+DP) zoj 3027

Travelling Fee Time Limit: 2 Seconds      Memory Limit: 65536 KB Samball is going to travel in the coming vacation. Now it's time to make a plan. After choosing the destination city, the next step is to determine the travel route. As this poor guy ha

FZUOJ Problem 2200 cleaning DP

Problem 2200 cleaning  Problem Description N个人围成一圈在讨论大扫除的事情,需要选出K个人.但是每个人与他距离为2的人存在矛盾,所以这K个人中任意两个人的距离不能为2,他们想知道共有多少种方法.  Input 第一行包含一个数T(T<=100),表示测试数据的个数. 接下来每行有两个数N,K,N表示人数,K表示需要的人数(1<=N<=1000,1<=K<=N).  Output 输出满足题意的方案数,方案数很大,所以请输出方案数mo

FZU Problem 2200 cleaning dp

Problem Description N个人围成一圈在讨论大扫除的事情,需要选出K个人.但是每个人与他距离为2的人存在矛盾,所以这K个人中任意两个人的距离不能为2,他们想知道共有多少种方法. Input 第一行包含一个数T(T<=100),表示测试数据的个数. 接下来每行有两个数N,K,N表示人数,K表示需要的人数(1<=N<=1000,1<=K<=N). Output 输出满足题意的方案数,方案数很大,所以请输出方案数mod 1,000,000,007 后的结果. Sam

Numbering Paths (Uva 125 floyd+dp思想)

Numbering Paths Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Background Problems that process input and generate a simple ``yes'' or ``no'' answer are called decision problems. One class of decis

Aizu - 2200 Mr. Rito Post Office

题意:/*你是某个岛国(ACM-ICPC Japan)上的一个苦逼程序员,你有一个当邮递员的好基友利腾桑遇到麻烦了:全岛有一些镇子通过水路和旱路相连,走水路必须要用船,在X处下船了船就停在X处.而且岛上只有一条船,下次想走水路还是得回到X处才行:两个镇子之间可能有两条以上的水路或旱路:邮递员必须按照清单上的镇子顺序送快递(镇子可能重复,并且对于重复的镇子不允许一次性处理,比如ABCB的话B一定要按顺序走两次才行).*/ 思路:弗洛伊德求出弗洛伊德求出陆路,水路任意两点间的最短距离,然后动态规划求