http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1014 (题目链接)

题意

  从无向图图上一点到达另一点,可以步行,搭公交或者是打的,不同的交通方式花的钱不同,当然消耗的时间也不同。求从起点S到终点T在花费的总钱数少于L的情况下的最短时间。

Solution

  应YZC的邀请做了这道题,就是一个分层图最短路,转移有点恶心。

细节

  注意初始化,以及公交车两两之间走的不是最短路,而是两点之间的直接相连的边。

代码

// csuoj1014
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#define LL long long
#define inf 1000000000
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=200,maxm=1010,maxw=3010;
struct edge {int to,next,w;}e[maxm<<1];
struct data {int num,w;};
int head[maxn],vis[maxn][maxw],t[maxn][maxn],n,m,S,T,B,L,cnt;
int dis[maxn][maxw],f[maxn][maxn],d[maxn][maxn];
vector<int> v[maxn];
queue<data> q; void link(int u,int v,int w) {
e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;e[cnt].w=w;
e[++cnt].to=u;e[cnt].next=head[v];head[v]=cnt;e[cnt].w=w;
}
void Init() {
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) f[i][j]=d[i][j]=inf;
for (int i=1;i<=n;i++) f[i][i]=head[i]=0;
for (int i=1;i<=n;i++) v[i].clear();
while (!q.empty()) q.pop();
cnt=0;
}
void Floyed() {
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (i!=j && j!=k && i!=k)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
}
void walk(data x) {
for (int i=head[x.num];i;i=e[i].next)
if (dis[e[i].to][x.w+e[i].w*3]>dis[x.num][x.w]+e[i].w*1000) {
dis[e[i].to][x.w+e[i].w*3]=dis[x.num][x.w]+e[i].w*1000;
if (!vis[e[i].to][x.w+e[i].w*3]) {
q.push((data){e[i].to,x.w+e[i].w*3});
vis[e[i].to][x.w+e[i].w*3]=1;
}
}
}
void bus(data x) {
for (int i=0;i<(int)v[x.num].size();i++) {
int s,p=v[x.num][i];
for (s=1;s<=t[p][0];s++) if (t[p][s]==x.num) break;
s++;
double D=0;
for (s;s<=t[p][0];s++) {
D+=d[t[p][s-1]][t[p][s]];
if (dis[t[p][s]][x.w+6]>dis[x.num][x.w]+D*250) {
dis[t[p][s]][x.w+6]=dis[x.num][x.w]+D*250;
if (!vis[t[p][s]][x.w+6]) {
q.push((data){t[p][s],x.w+6});
vis[t[p][s]][x.w+6]=1;
}
}
}
}
}
void taxi(data x) {
for (int i=1;i<=n;i++) if (i!=x.num) {
int W=x.w+10+(f[x.num][i]>3 ? 2*(f[x.num][i]-3) : 0);
if (dis[i][W]>dis[x.num][x.w]+f[x.num][i]*125) {
dis[i][W]=dis[x.num][x.w]+f[x.num][i]*125;
if (!vis[i][W]) {
q.push((data){i,W});
vis[i][W]=1;
}
}
}
}
void SPFA(int s) {
for (int i=1;i<=n;i++)
for (int j=0;j<=L;j++) dis[i][j]=inf;
dis[s][0]=0;
q.push((data){s,0});
while (!q.empty()) {
data x=q.front();q.pop();
vis[x.num][x.w]=0;
walk(x);
bus(x);
taxi(x);
}
}
int main() {
int Case;scanf("%d",&Case);
while (Case--) {
scanf("%d%d%d%d%d%d",&L,&n,&m,&S,&T,&B);
Init();
for (int uu,vv,ww,i=1;i<=m;i++) {
scanf("%d%d%d",&uu,&vv,&ww);
link(uu,vv,ww);
d[uu][vv]=d[vv][uu]=f[uu][vv]=f[vv][uu]=ww;
}
for (int i=1;i<=B;i++) {
scanf("%d",&t[i][0]);
for (int j=1;j<=t[i][0];j++) {
scanf("%d",&t[i][j]);
v[t[i][j]].push_back(i);
}
}
Floyed();
SPFA(S);
int ans=inf;
for (int i=0;i<=L;i++) ans=min(ans,dis[T][i]);
if (ans==inf) printf("no\n");
else printf("%d\n",ans);
}
return 0;
}

  

【csuoj1014】 西湖三人行的更多相关文章

  1. VR技术驱动智慧旅游,自由漫步西湖不是梦

         虚拟现实技术是今年最热门的科技之一,不少行业都在嫁接VR功能,其中旅游业也具备这方面的优势.VR+旅游,能让你足不出户即可感受清净唯美的名胜古迹.据591ARVR资讯网www.591arvr ...

  2. 六大免费网站数据采集器对比(火车头,海纳,云采集,ET,三人行,狂人采集)

    2013年02月27日 PHP开源系统 暂无评论 阅读 497 views 次 在目前的站长圈内,比较流行的采集工具有很多,但是总结起来,比较出名的免费的就这么几个:火车头,海纳,云采集,ET,三人行 ...

  3. PAT 1088 三人行 模拟,坑 C

    PAT 1088 三人行 https://pintia.cn/problem-sets/994805260223102976/problems/1038429286185074688 题目: 子曰:“ ...

  4. PAT 1088 三人行(20 分)(暴力破解+流程分析)

    1088 三人行(20 分) 子曰:"三人行,必有我师焉.择其善者而从之,其不善者而改之." 本题给定甲.乙.丙三个人的能力值关系为:甲的能力值确定是 2 位正整数:把甲的能力值的 ...

  5. CTF西湖论剑

    一,西湖论剑 itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是要写入转换结果的目标字符串,第三个参数是转移数字时所用 的基数.在上例中,转换基数为10.10:十进制:2:二进制... ...

  6. PAT 1088 三人行

    https://pintia.cn/problem-sets/994805260223102976/problems/1038429286185074688 子曰:“三人行,必有我师焉.择其善者而从之 ...

  7. 转载《五大免费采集器哪个好,火车头,海纳,ET,三人行,狂人采集 》

    在目前的站长圈内,比较流行的采集工具有很多,但是总结起来,比较出名的免费的就这么几个:火车头,海纳,ET,三人行,狂人. 下面我们对这几款采集工具作一个简单的评比. 1.火车头 基本上人人都知道,那就 ...

  8. PAT(B) 1088 三人行(Java)

    题目链接:1088 三人行 (20 point(s)) 参考博客:PAT (Basic Level) Practice (中文)1088 三人行 (20 分)(Java实现)吃口雪花 题目描述 子曰: ...

  9. PAT Basic 1088 三人行 (20 分)

    子曰:“三人行,必有我师焉.择其善者而从之,其不善者而改之.” 本题给定甲.乙.丙三个人的能力值关系为:甲的能力值确定是 2 位正整数:把甲的能力值的 2 个数字调换位置就是乙的能力值:甲乙两人能力差 ...

随机推荐

  1. 007商城项目:商品列表查询-需求分析,以及Spinmvc的访问知识

    我们之前已经整合了ssm框架并且调试已经好了,接下来我们实现商品列表的查询. 我们先进入到首页: 方法如下: 我们看到我们把所有的jsp页面都是放在: 这些页面都是放在WEB-IN下面的,也就是说这些 ...

  2. 15个nosql数据库

    1.MongoDB 介绍 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.主要解决的是海量数据的访问效率问题,为WEB应用提供可扩展的高性能数据存储解决方案.当数据量达到50GB以上 ...

  3. ZooKeeper 笔记(3) 实战应用之【统一配置管理】

    大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应用,往往会使用一些公用的资源,比如:需要文件上传.下载时,各子应用都会访问公用的Ftp服务器.如果把Ftp Server的连接IP.端口号 ...

  4. swift-sharesdk集成微信、Facebook第三方登录

    好久没有写博客了.最近忙得没有时间更新博客,很忙很忙. 今天就把自己做过的第三方集成和大家分享一下,请大家多多指教. 第一步: 一.获取AppKey(去官方平台注册) 二.下载SDK 三.快速集成 第 ...

  5. DOM 概况

    DOM(文档对象模型)是针对 HTML 和 XML 文档的一个API(应用程序编程接口).DOM 描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分. 层次节点 DOM可以将任何 H ...

  6. 高性能JavaScript 重排与重绘

    先回顾下前文高性能JavaScript DOM编程,主要提了两点优化,一是尽量减少DOM的访问,而把运算放在ECMAScript这一端,二是尽量缓存局部变量,比如length等等,最后介绍了两个新的A ...

  7. github开源:企业级应用快速开发框架CIIP WEB+WIN+移动端

    简介 CIIP是基于XAF开发的开源信息系统框架.CIIP最常见的应用场景是基于数据库的企业级应用程序,例如供应链系统,ERP系统,MRP系统,CRM系统等. CIIP支持WEB版本.Windows桌 ...

  8. DOM之parentNode与offsetParent

    DOM中有两个属性parentNode和offsetParent,想必区别大家都是知道的,可用法上还是有一些需要注意的地方,尤其是后者,想知道吗?继续往下看咯. parentNode指的是父节点,el ...

  9. cocos2dx-2.2.1 免 Cygwin 环境搭建(Win8+VS2013+ADT Bundle+android-ndk-r9c)

    1.下载 ADT Bundle 解压到D盘 D:\adt-bundle-windows-x86_64-20131030: 2.下载 NDK-R9C,解压到 ADT 目录下:D:\adt-bundle- ...

  10. O2O营销模式(Online To Offline)

    什么是O2O营销模式 O2O营销模式又称离线商务模式,是指线上营销线上购买带动线下经营和线下消费.O2O通过打折.提供信息.服务预订等方式,把线下商店的消息推送给互联网用户,从而将他们转换为自己的线下 ...