题目链接

题意: 给一张图,让你求权值和路径最小的移动序列,使得移动序列包含两个给定的子序列。

思路: 由于要求权值和最小,所以我们可以先把图上每两点的最短距离预处理出来。然后考虑移动序列,由于要保证包含两个子序列,考虑dp,设dp[i][j][0]表示刚好到了第一个人的第i个跑位点并已经过了第二个人的第j个跑位点的最短路径,dp[i][j][1]表示刚好到了第二个人的第j个跑位点并已经过了第一个人的第i个跑位点的最短路径。设d[i][j]为点i到点j的最短距离。
则有:
d p [ i ] [ j ] [ 0 ] = d p [ i ] [ j ] [ 1 ] = i n f dp[i][j][0]=dp[i][j][1]=inf dp[i][j][0]=dp[i][j][1]=inf(初始化为无穷大)
d p [ 0 ] [ 0 ] [ 0 ] = d p [ 0 ] [ 0 ] [ 1 ] = 0 dp[0][0][0]=dp[0][0][1]=0 dp[0][0][0]=dp[0][0][1]=0
d p [ i + 1 ] [ j ] [ 0 ] = m i n ( d p [ i + 1 ] [ j ] [ 0 ] , m i n ( d p [ i ] [ j ] [ 0 ] + d [ a [ i ] ] [ a [ i + 1 ] ] , d p [ i ] [ j ] [ 1 ] + d [ b [ j ] ] [ a [ i + 1 ] ] ) ) dp[i+1][j][0]=min(dp[i+1][j][0],min(dp[i][j][0]+d[a[i]][a[i+1]],dp[i][j][1]+d[b[j]][a[i+1]])) dp[i+1][j][0]=min(dp[i+1][j][0],min(dp[i][j][0]+d[a[i]][a[i+1]],dp[i][j][1]+d[b[j]][a[i+1]]))
d p [ i ] [ j + 1 ] [ 1 ] = m i n ( d p [ i ] [ j + 1 ] [ 1 ] , m i n ( d p [ i ] [ j ] [ 1 ] + d [ b [ j ] ] [ b [ j + 1 ] ] , d p [ i ] [ j ] [ 0 ] + d [ a [ i ] ] [ b [ j + 1 ] ] ) ) dp[i][j+1][1]=min(dp[i][j+1][1],min(dp[i][j][1]+d[b[j]][b[j+1]],dp[i][j][0]+d[a[i]][b[j+1]])) dp[i][j+1][1]=min(dp[i][j+1][1],min(dp[i][j][1]+d[b[j]][b[j+1]],dp[i][j][0]+d[a[i]][b[j+1]]))

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
#define pb push_back
#define ft first
#define sd second
const int inf=0x3f3f3f3f;
const int maxn=1e3+10;
int n,m;
struct edge{int t,v;edge(){}edge(int t,int v):t(t),v(v){}
};
int a[107],b[107];
bool vis[maxn];
int d[maxn][maxn];
ll dp[maxn][maxn][2];
vector<edge> e[maxn];
void dij(int s,int op){for(int i=1;i<=n;i++){d[op][i]=inf;vis[i]=0;}priority_queue<P,vector<P>,greater<P> > pq;while(!pq.empty())pq.pop();d[op][s]=0;pq.push(P(0,s));P tmp;while(!pq.empty()){tmp=pq.top();pq.pop();int u=tmp.sd;if(vis[u])continue;vis[u]=1;for(int i=0;i<(int)e[u].size();i++){int v=e[u][i].t;int c=e[u][i].v;if(!vis[v]&&d[op][v]>d[op][u]+c){d[op][v]=d[op][u]+c;pq.push(P(d[op][v],v));}}}
}
int main(){scanf("%d%d",&n,&m);int u,v,w;for(int i=0;i<m;i++){scanf("%d%d%d",&u,&v,&w);e[u].pb(edge(v,w));e[v].pb(edge(u,w));}int op1,op2;scanf("%d",&op1);for(int i=1;i<=op1;i++)scanf("%d",&a[i]);scanf("%d",&op2);for(int i=1;i<=op2;i++)scanf("%d",&b[i]);for(int i=1;i<=n;i++)dij(i,i);memset(dp,0x3f,sizeof(dp));dp[0][0][0]=dp[0][0][1]=0;for(int i=0;i<=op1;i++){for(int j=0;j<=op2;j++){if(i<op1){dp[i+1][j][0]=min(dp[i+1][j][0],dp[i][j][0]+(ll)d[a[i]][a[i+1]]);dp[i+1][j][0]=min(dp[i+1][j][0],dp[i][j][1]+(ll)d[b[j]][a[i+1]]);}if(j<op2){dp[i][j+1][1]=min(dp[i][j+1][1],dp[i][j][1]+(ll)d[b[j]][b[j+1]]);dp[i][j+1][1]=min(dp[i][j+1][1],dp[i][j][0]+(ll)d[a[i]][b[j+1]]);}}}ll ans=min(dp[op1][op2][0],dp[op1][op2][1]);cout<<ans<<'\n';return 0;
}

小doge的快乐阳光跑 //最短路+dp相关推荐

  1. 湖南快乐阳光互动娱乐传媒有限公司诉被告杭州三基传媒有限公司侵害作品信息网络传播权纠纷一案

    杭州市滨江区人民法院民事 判 决 书 (2013)杭滨知初字第653号 原告:湖南快乐阳光互动娱乐传媒有限公司. 法定代表人:张若波. 委托代理人:陆刚.刘小娇. 被告:杭州三基传媒有限公司. 法定代 ...

  2. python做好的程序如何变成小程序-使用python编写简单的小程序编译成exe跑在win10上...

    每天的工作其实很无聊,早知道应该去IT公司闯荡的.最近的工作内容是每逢一个整点,从早7点到晚11点,去查一次客流数据,整理到表格中,上交给素未蒙面的上线,由他呈交领导查阅. 人的精力毕竟是有限的,所以 ...

  3. 【牛客 - 370B】Rinne Loves Graph(分层图最短路 或 最短路dp)

    题干: Island 发生了一场暴乱!现在 Rinne 要和 Setsuna 立马到地上世界去. 众所周知:Island 是有一些奇怪的城镇和道路构成的(题目需要,游戏党勿喷),有些城镇之间用双向道路 ...

  4. 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP

    [BZOJ1880][Sdoi2009]Elaxia的路线 Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起 ...

  5. 【BZOJ1003】【codevs1655】物流运输,最短路+DP

    传送门1 传送门2 思路: 一直跑最短路不一定是最优解 g[i][j]表示仅走i~j天可通过的码头的最短路 f[i]表示走到第i天的最短路 f[i]=min(f[j]+g[j+1][i]*(i-j)+ ...

  6. P1772 [ZJOI2006]物流运输 最短路+DP

    思路:最短路+DP 提交:1次 题解: $f[i]$表示到第$i$天的最小代价,我们可以预先处理出$i,j$两天之间(包括$i,j$)都可通行的最短路的代价记做$s[i][j]$,然后有$f[i]=m ...

  7. 【HYSBZ - 2763 】飞行路线 (分层图最短路,最短路dp)

    题干: Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价 ...

  8. exfat为什么不适合机械硬盘_为什么有人说小排量车不适合跑高速,多少排量的车适合?...

    阅读本文前,请您先点击上面的蓝色字体"梅赛德斯丶Benz",再点击"关注",这样您就可以继续免费收到祝福了.每天都有分享,完全是免费订阅,请放心关注. 哈喽,小 ...

  9. 微信小程序教程:文字跑马灯效果

    当你的微信小程序内容中出现文字跑马灯效果,会不会觉得很拉风,接下来大家详细讲解下如何操作实现这效果. 效果: wxml <view>1 显示完后再显示</view> <v ...

最新文章

  1. Java EE---使用Spring框架创建Market小项目
  2. Apache ZooKeeper - ZK的数据和文件
  3. 使用 Commander 写自己的 Nodejs 命令
  4. HTTP总有你感兴趣的
  5. iOS Swift JSON解析教程
  6. 数组 / 伪数组 判断及方法调用 (权威指南笔记)
  7. 转:为 setuptools 开路搭桥
  8. 女生转行成为程序员的顾虑和优势
  9. springboot修改默认端口号,启动端口号
  10. 生信必备技巧之R语言基础教程01——R、Rstudio以及R包的安装载入
  11. 【SQL】用SQL语句表示同比和环比
  12. 2020-12-19 nn.CrossEntropyLoss()
  13. 2022茶艺师(中级)考题及模拟考试
  14. iOS 依赖注入:Objection 和 Typhoon
  15. Python在WRF模型自动化运行及前后处理中的应用
  16. 天然产物来源的新型除草剂研究取得进展
  17. Nginx编译安装与虚拟主机配置
  18. win7下mysql重置root口令
  19. Luxurious Houses - CodeForces - 581B
  20. dhcp服务器自动分配地址思科,cisco dhcp服务器设置方法

热门文章

  1. pytorch的词嵌入函数nn.Embedding
  2. 了解Google的开源HTML5解析引擎Gumbo
  3. java中输出数组元素的方法
  4. Vanet:生成ns3仿真所需的车辆移动文件(*.tcl)
  5. 最美的教育最简单-保卫纯真童年
  6. Oracle授权详细解释
  7. 【面试】记一次安恒面试及总结
  8. 迷茫,迷茫在迷茫中!
  9. 隐藏nginx返回的Server信息
  10. 【项目实战】TP5验证码的引用