【csuoj1014】 西湖三人行
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】 西湖三人行的更多相关文章
- VR技术驱动智慧旅游,自由漫步西湖不是梦
虚拟现实技术是今年最热门的科技之一,不少行业都在嫁接VR功能,其中旅游业也具备这方面的优势.VR+旅游,能让你足不出户即可感受清净唯美的名胜古迹.据591ARVR资讯网www.591arvr ...
- 六大免费网站数据采集器对比(火车头,海纳,云采集,ET,三人行,狂人采集)
2013年02月27日 PHP开源系统 暂无评论 阅读 497 views 次 在目前的站长圈内,比较流行的采集工具有很多,但是总结起来,比较出名的免费的就这么几个:火车头,海纳,云采集,ET,三人行 ...
- PAT 1088 三人行 模拟,坑 C
PAT 1088 三人行 https://pintia.cn/problem-sets/994805260223102976/problems/1038429286185074688 题目: 子曰:“ ...
- PAT 1088 三人行(20 分)(暴力破解+流程分析)
1088 三人行(20 分) 子曰:"三人行,必有我师焉.择其善者而从之,其不善者而改之." 本题给定甲.乙.丙三个人的能力值关系为:甲的能力值确定是 2 位正整数:把甲的能力值的 ...
- CTF西湖论剑
一,西湖论剑 itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是要写入转换结果的目标字符串,第三个参数是转移数字时所用 的基数.在上例中,转换基数为10.10:十进制:2:二进制... ...
- PAT 1088 三人行
https://pintia.cn/problem-sets/994805260223102976/problems/1038429286185074688 子曰:“三人行,必有我师焉.择其善者而从之 ...
- 转载《五大免费采集器哪个好,火车头,海纳,ET,三人行,狂人采集 》
在目前的站长圈内,比较流行的采集工具有很多,但是总结起来,比较出名的免费的就这么几个:火车头,海纳,ET,三人行,狂人. 下面我们对这几款采集工具作一个简单的评比. 1.火车头 基本上人人都知道,那就 ...
- PAT(B) 1088 三人行(Java)
题目链接:1088 三人行 (20 point(s)) 参考博客:PAT (Basic Level) Practice (中文)1088 三人行 (20 分)(Java实现)吃口雪花 题目描述 子曰: ...
- PAT Basic 1088 三人行 (20 分)
子曰:“三人行,必有我师焉.择其善者而从之,其不善者而改之.” 本题给定甲.乙.丙三个人的能力值关系为:甲的能力值确定是 2 位正整数:把甲的能力值的 2 个数字调换位置就是乙的能力值:甲乙两人能力差 ...
随机推荐
- 表单 - Form - 无刷新提交原理
为什么Form组件的表单提交可以做到无刷新? EasyUI在提交的时候,将表单作为一个隐藏的iframe进行的提交,并不是我们看到的那个表单进行的提交 并且那个iframe使用了绝对定位,保证页面上不 ...
- 030医疗项目-模块三:药品供应商目录模块——供货商药品目录查询功能----------Dao层:基本的查询语句的编写
我们安装显示的要求: 我们能看到显示的目录里面有:供货企业的名字(这个数据来自于供货商的表[usergys]),流水号,通用名,剂型(这些都来自药品信息表),供货的状态(这个呢在gysypml_con ...
- I/O 流和对象序列化
一.I/O 流(java 如何实现与外界数据的交流) 流定义: 任何有能力产出数据的数据源对象或者有能力接收数据的数据源对象.他屏蔽了实际的I/O设备处理数据的细节. 1.Input/Output:指 ...
- C语言复习(1)
test.c #include <stdio.h> int main(){ printf("hello\n"); return 0; } 1.预处理阶段 由于在test ...
- 通过源码分析MyBatis的缓存
前方高能! 本文内容有点多,通过实际测试例子+源码分析的方式解剖MyBatis缓存的概念,对这方面有兴趣的小伙伴请继续看下去~ MyBatis缓存介绍 首先看一段wiki上关于MyBatis缓存的介绍 ...
- Spark源码在Eclipse中部署/编译/运行
(1)下载Spark源码 到官方网站下载:Openfire.Spark.Smack,其中Spark只能使用SVN下载,源码的文件夹分别对应Openfire.Spark和Smack. 直接下载Openf ...
- MySQL Workbench使用及教程
MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具.它是著名的数据库设计工具DBDesigner4的继任者.你可以用MySQL Workbench设计和创建新的数据库图示,建 ...
- Java网络编程——IP
类:InetAdrress 该类主要用于表示互联网协议(IP对象)地址,且无构造方法 主要方法: public static InetAddress getLocalHost()-->返回本地主 ...
- px和em和rem的区别
一.px特点: 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位: 3. Firefox能够调整px和em,rem,但是96 ...
- android 入门笔迹(1)
环境搭建JDK,JRE,Android SDK,ADT,Eclipse,安卓模拟器AVD xml控制UI界面 Java代码控制UI界面 XML与Java混合控制UI界面 UI:userinter ...