Aoj

编程入门 行业动态 更新时间:2024-10-07 08:24:49

<a href=https://www.elefans.com/category/jswz/34/1768681.html style=Aoj"/>

Aoj

[题目链接]

思路:想想脑瓜就疼,好复杂,看着题解吧啦吧啦一下~~

在一些城市中有水路和陆路连接,每一条路都有长度。但是水路必须乘船,且坐船到达某个位置后船必须留在那里,下次坐必须回到该地。现在有m城市要到达,且必须按照指定的顺序,问最小代价。

最短路+dp:

  • 首先预处理出任意两点间只走水路或陆路的最小代价,然后考虑dp。
  • 记状态dp[i][j]代表要到第i个任务所指定的城市且将船扔到j号城市的最小代价。可以考虑两种情况:只走陆地和陆地水路混合走/只走水路。那么转移非常显然:
    1. 只走陆地:直接加上陆地最短路即可,船的位置不变。
    2. 混合走/只走水路:从当前点走陆地->停船点->新的停船点->走陆地到目的地,船就停到了新的停船点。
  • 但是要特殊处理一下第一个点,因为它可能会先把船停到某个地方,然后再回到初始点,为后面做准备。

代码:

/*memset(int) inf=1061109567memset(ll) inf=4557430888798830399memset初始化的int型inf三个相加爆int!三个ll型爆ll!!!
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int Max_n=220;
const int Max_m=1100;int n,m,r;
ll land[Max_n][Max_n],water[Max_n][Max_n];
ll dp[Max_m][Max_n];
int s[Max_m];void floyd(){for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){land[i][j]=min(land[i][j],land[i][k]+land[k][j]);water[i][j]=min(water[i][j],water[i][k]+water[k][j]);}}}
}int main()
{while(~scanf("%d%d",&n,&m)&&n+m){for(int i=0;i<Max_n;i++){for(int j=0;j<Max_n;j++){if(i==j){land[i][j]=0;water[i][j]=0;}else {land[i][j]=inf;water[i][j]=inf;}}}int a,b;ll c;char ch;for(int i=0;i<m;i++){scanf("%d%d%lld %c",&a,&b,&c,&ch);if(ch=='L'){land[a][b]=min(land[a][b],c);land[b][a]=land[a][b];}else {water[a][b]=min(water[a][b],c);water[b][a]=water[a][b];}}floyd();scanf("%d",&r);for(int i=1;i<=r;i++)scanf("%d",&s[i]);for(int i=0;i<=r;i++)for(int j=0;j<=n;j++)dp[i][j]=inf;//第一次出发可以将船停到任意处再坐船回到当前目标点for(int i=1;i<=n;i++)dp[1][i]=water[s[1]][i]+land[i][s[1]];for(int i=2;i<=r;i++){ //目的地 for(int j=1;j<=n;j++){ //上次停船点 dp[i][j]=min(dp[i][j],dp[i-1][j]+land[s[i-1]][s[i]]); //走旱路for(int k=1;k<=n;k++){ //现在停船点 dp[i][k]=min(dp[i][k],dp[i-1][j]+land[s[i-1]][j]+water[j][k]+land[k][s[i]]); //走水路 }}}ll Min=inf;for(int i=1;i<=n;i++)Min=min(dp[r][i],Min);printf("%lld\n",Min);}return 0;
}

更多推荐

Aoj

本文发布于:2024-02-28 05:57:46,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1768407.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Aoj

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!