【题目链接】 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2200

【题目大意】

  一张图中有陆路和水路,水路必须要有船才能走,当船开到x点时就会停在x点
  一开始人和船都在1点,问按给出顺序访问一些点需要的最短时间

【题解】

  利用floyd可以得出只走陆路和只走水路时两点间的最短路
  dp[i][j]表示走到了第i个需要访问的村庄,船停在j点的最短路,然后顺序dp更新状态即可

【代码】

#include <cstdio>
#include <algorithm>
#include <cstring>
#define rep(i,n) for(int i=1;i<=n;i++)
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
int n,m,q,x,y,z,d[1010]; char c;
int dl[210][210],ds[210][210],dp[1010][210];
int main(){
while(~scanf("%d%d",&n,&m),n+m){
rep(i,n)rep(j,n)ds[i][j]=dl[i][j]=i==j?0:INF;
rep(i,m){
scanf("%d%d%d %c",&x,&y,&z,&c);
if(c=='S')ds[x][y]=ds[y][x]=min(ds[x][y],z);
else dl[x][y]=dl[y][x]=min(dl[x][y],z);
}scanf("%d",&q);
rep(i,q)scanf("%d",d+i);
rep(k,n)rep(i,n)rep(j,n){
ds[i][j]=min(ds[i][j],ds[i][k]+ds[k][j]);
dl[i][j]=min(dl[i][j],dl[i][k]+dl[k][j]);
}memset(dp,INF,sizeof(dp));
dp[1][d[1]]=0;
rep(i,q)rep(j,n){
dp[i][j]=min(dp[i][j],dp[i-1][j]+dl[d[i-1]][d[i]]);
rep(k,n)dp[i][k]=
min((LL)dp[i][k],(LL)dp[i-1][j]+dl[d[i-1]][j]+ds[j][k]+dl[k][d[i]]);
}printf("%d\n",*min_element(dp[q],dp[q]+n+1));
}return 0;
}

最新文章

  1. arcgis api for js入门开发系列五地图态势标绘(含源代码)
  2. 一小时学会C# 6
  3. 关于javascript对象的简单记忆法
  4. css选择器,用来处理隔行变色的表格
  5. 默认时,销毁会话,session_unset, session_destory
  6. MAVEN 工程打包resources目录外的更多资源文件
  7. d008: 求两数的整数商 和 商
  8. delphi BitmapCompress
  9. Ruby学习之代码块
  10. MongoDB中文档操作(二)
  11. 十大经典排序算法详细总结(含JAVA代码实现)
  12. vue(基础一)_基本指令的使用
  13. .net获取程序根目录
  14. 了解tomcat
  15. 20145320《网络对抗》逆向及Bof基础实践
  16. CF-517C-思维/math
  17. 2015年第六届蓝桥杯JavaB组省赛试题解析
  18. Android DevArt6:Android中IPC的六种方式
  19. Scala学习之路 (八)Scala的隐式转换和隐式参数
  20. Apache2.4.7 + php5 + mysql thinkphp

热门文章

  1. 类与对象 - PHP手册笔记
  2. autofac使用笔记
  3. 手动升级Delphi控件时,修改inc文件的办法
  4. 链表k个节点反向
  5. python之花瓣美女下载
  6. rpm包下载网站
  7. flume【源码分析】分析Flume的拦截器
  8. nyoj 1237 最大岛屿(dfs)
  9. bzoj 维护序列seq(双标记线段树)
  10. 命令行运行命令时报错You don&amp;#39;t have write permissions for the /Library/***