【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 个数字调换位置就是乙的能力值:甲乙两人能力差 ...
随机推荐
- ISAPI_Rewrite中文手册
参考:http://blog.csdn.net/fanxiaojie119/article/details/5353186 第一章:软件介绍ISAPI_Rewrite 是一款适用于IIS的功能强大的基 ...
- wcf的诡异问题
最近在做工作流设计器用的silverlight 使用wcf服务. 过程中遇到了两个奇怪的问题. 1. 出现整型参数无法传递到服务器的情况 2.出现反序列化失败的情况. 经过仔细排查发现 每个属性都有一 ...
- 解决Ehcache缓存警告问题
警告: Creating a new instance of CacheManager using the diskStorePath "D:\Apache Tomcat 6.0.18\te ...
- MVP 实例
引言 可能有的朋友已经看过我翻译的Jean-Paul Boodhoo的 模型-视图-提供器 模式 一文了(如果没有,建议你先看下再看这篇文章,毕竟这两篇是紧密联系的).在那篇文章中,作者为了说明 MV ...
- listview+seekbar问题的解决
最近做了个项目,其中有录音播放功能.每次录音结束都会在listView中显示,在listView中能播放每次的录音,也可以每条录音之间的切换播放.随之就引发了许多的问题,比如当我播放第一条录音的时所有 ...
- 使用 data-* 属性来嵌入自定义数据
1. HTML 实例 <ul> <li data-animal-type="bird">Owl</li> <li data-animal- ...
- 后记:Cookie安全大辩论总结
前天,我发布在博客园上的某知名电商网站的Cookie漏洞引发园友们的热议,学到了很多知识,现在整理一下其中比较激烈的技术讨论.谁对谁错每个人自己心中都有一把称,很多时候都是我无法说服你,你也无法说服我 ...
- 使用HttpWebRequest和HtmlAgilityPack抓取网页(拒绝乱码,拒绝正则表达式)
废话不多说, 直接说需求. 公司的网站需要抓取其他网站的文章,但任务没到我这,同事搞了一下午没搞出来.由于刚刚到公司, 想证明下自己,就把活揽过来了.因为以前做过,觉得应该很简单,但当我开始做的时候, ...
- 封装好的socket,拿去用
年终有空咯,分享一下自己封装的socket类库. 由于公司写的socket代码非常醉人,我不能忍,所以自己封装了一下方便大家使用,现在有空也分享给园友用用看,现在还存在一定的问题,等下我列出来,希望大 ...
- WebService的两种方式SOAP和REST比较 (转)
我的读后感:由于第一次接触WebService,对于很多概念不太理解,尤其是看到各个OpenAPI的不同提供方式时,更加疑惑.如google map api采用了AJAX方式,通过javascript ...