链接:https://ac.nowcoder.com/acm/contest/949/J
来源:牛客网

题目描述

小雨所在的城市一共有 m 条地铁线,分别标号为 1 号线,2 号线,……,m 号线。整个城市一共有 n 个车站,编号为 1∼n。其中坐 i 号线需要花费 ai 的价格,每坐一站就需要多花费 bi 的价格。i 号线有 ci 个车站,而且这 ci 个车站都已知,如果某一站有多条地铁线经过,则可以在这一站换乘到另一条地铁线,并且能多次换乘。现在小雨想从第 s 个车站坐地铁到第 t 个车站,地铁等待时间忽略不计,求最少花费的价格,若不能到达输出 -1 。(地铁是双向的,所以 s 可能大于 t)

输入描述:

第一行输入四个正整数 n,m,s,t,分别表示车站个数,地铁线数,起点站和终点站。
第二行到第 m+1 行,每行前三个数为 ai,bi,ci,分别表示坐 i 号线的价格,i 号线每坐一站多花的价格,i 号线车站个数。接下来 ci 个数,表示 i 号线的每一个车站的编号,单调递增。

输出描述:

共一行,一个数表示最小花费,若不能到达输出 -1 。

示例1
输入

5 2 1 4
2 2 3 1 3 5
2 1 4 2 3 4 5

输出

7

说明

坐 1 号线:花费 2;
1→3:花费 2;
换乘 2 号线:花费 2;
3→4:花费 1;
所以最小总花费为 7 。

备注:

1 ≤ n ≤ 103, 1 ≤ m ≤ 500, 1 ≤ s,t ≤ n,1 ≤ ai,bi≤100 , 1 ≤ ci ≤ n, ∑ ci≤105


分析:

不同的地铁线路属于不同的层次,所以是分层图,但是不同层的图之间有相交,如果两两暴力连图时间复杂度会达到O(n*m2)

这里就要用到虚点,就是在原有分层图的基础上再加一层分层图,里面是1~n 所有点的虚点,用于作为中转站(相当于人在地铁站,但是还没决定做哪一号线路),所有点到其虚点的花费为0,而从虚点到对应点的花费为该点所在地铁线路的初始花费

这样建图的时间复杂度就只有O(n*2m)了,同时在使用最短路算法时,起点s和终点t都选定在其虚点上(不然会有多个s和t,而且需要考虑从某一条地铁线路开始的花费)

对于点的编号,因为一条线路(一层分层图)上至多有n个点,所以不同线路的编号可以依次加上0、n、2n、… 、(m-1)* n,而虚点则加上 m* n。


以下代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<algorithm>
#define PII pair<int,int>
#define LL long long
using namespace std;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;
const int maxn=1e3+50;
const int maxm=500+50;
int n,m,s,t;
int head[maxn*maxm],cnt;
int dist[maxn*maxm];
bool vis[maxn*maxm];
struct edge
{int u;int v;int c;int next;
}e[maxn*maxn];
struct node {int d, id;node(int a,int b){d=a;id=b;}bool friend operator < (node x, node y) {return x.d > y.d;}
};
void addedge(int u,int v,int c)
{e[cnt].u=u;e[cnt].v=v;e[cnt].c=c;e[cnt].next=head[u];head[u]=cnt++;
}
void dijkstra(int s)
{memset(dist,0x3f,sizeof(dist));memset(vis,false,sizeof(vis));priority_queue<node> q;dist[s]=0;q.push(node(0,s));while(!q.empty()){int u=q.top().id;q.pop();if(vis[u])continue;elsevis[u]=true;for(int i=head[u];i!=-1;i=e[i].next){int v=e[i].v;if(!vis[v]&&dist[u]+e[i].c<dist[v]){dist[v]=dist[u]+e[i].c;q.push(node(dist[v],v));}}}
}
int main()
{memset(head,-1,sizeof(head));cnt=0;scanf("%d %d %d %d",&n,&m,&s,&t);for(int i=1;i<=m;i++){int a,b,c,x,pre;scanf("%d %d %d",&a,&b,&c);for(int j=1;j<=c;j++){scanf("%d",&x);addedge((i-1)*n+x,n*m+x,0);  //与虚点相连addedge(n*m+x,(i-1)*n+x,a);if(j!=1){addedge((i-1)*n+pre,(i-1)*n+x,b);addedge((i-1)*n+x,(i-1)*n+pre,b);  //与同线路点相连}pre=x;}}dijkstra(n*m+s);if(dist[n*m+t]<INF)printf("%d\n",dist[n*m+t]);elseprintf("-1\n");return 0;
}

牛客小白月赛16 J-小雨坐地铁(分层图最短路)相关推荐

  1. 牛客小白月赛16 小石的签到题(博弈)

    牛客小白月赛16 小石的签到题 链接:https://ac.nowcoder.com/acm/contest/949/A来源:牛客网 题目描述 输入描述: 共一行,输入一个数 nnn . 输出描述: ...

  2. 牛客小白月赛24 J.建设道路

    牛客小白月赛24 J.建设道路 题目链接 题目描述 牛牛国有 nnn 个城市,编号为 1-n,第 iii 个城市有一个价值 aia_iai​ ,牛国的国王牛阔落特别喜欢在牛牛国旅游,并且他不想每次旅游 ...

  3. 牛客小白月赛28 J.树上行走

    牛客小白月赛28 J.树上行走 题目链接 题目描述 牛牛苦练武功绝学--轻功水上漂,最终没有练成,但是他学会了在树上行走的本领. 这天,牛牛落入了敌人的陷阱,身后有巨石追击,面前有n个点,n-1条边连 ...

  4. 牛客小白月赛21 J.Jelly

    牛客小白月赛21 J.Jelly 题目描述 Nancy喜欢吃果冻! Nancy钻进了一个n×n的果冻里,她想从(1,1,1)一路上.下.左.右.前.后六个方向吃到(n,n,n). 但果冻毕竟是有许多口 ...

  5. 牛客小白月赛6 J.洋灰三角

    牛客小白月赛6 J.洋灰三角 题目链接 题目描述 洋灰是一种建筑材料,常用来筑桥搭建高层建筑,又称,水泥.混凝土. WHZ有很多铸造成三角形的洋灰块,他想把这些洋灰三角按照一定的规律放到摆成一排的n个 ...

  6. 牛客小白月赛16练习

    G-小石的图形 链接:https://ac.nowcoder.com/acm/contest/949/G 来源:牛客网 题目描述 小石想在一面墙旁边建造一段长度为 n 的篱笆来围出一块地(如图). 求 ...

  7. 牛客小白月赛12 J 月月查华华的手机 (序列自动机模板题)

    链接:https://ac.nowcoder.com/acm/contest/392/J 来源:牛客网 题目描述 月月和华华一起去吃饭了.期间华华有事出去了一会儿,没有带手机.月月出于人类最单纯的好奇 ...

  8. 牛客小白月赛6 J 洋灰三角

    J  洋灰三角 题目: 链接:https://www.nowcoder.com/acm/contest/136/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262 ...

  9. 牛客小白月赛11 J Rinne Loves Math

    链接:https://ac.nowcoder.com/acm/contest/370/J 来源:牛客网 Rinne 刚刚学习了最简二次根式,于是她想用程序实现一个. 为了简化问题,在本题中,最简二次根 ...

最新文章

  1. 马云牛啊 从骑自行车到坐迈巴赫只用20年
  2. 使用svm的一个常见错误
  3. 990. Satisfiability of Equality Equations
  4. Argon-轻盈简洁好看的WordPress主题
  5. webpack5 模块联邦 single-spa基座微前端 systemjs
  6. dev代码拷贝中文乱码的解决方案
  7. 我怎么感觉js快无敌了~
  8. 15. PHP 全局变量 - 超全局变量
  9. cad的dwg文件转html文件,dwg转dwf文件怎么打开?
  10. 使用JS数组迭代方法渲染页面数据并实现查询功能
  11. Android 根据应用内选择时间调整TextClock时区
  12. 督查督办系统在企业能发挥哪些作用?
  13. 使用JavaScript使浏览器进入全屏或退出全屏
  14. Java项目校园兼职平台(含代码)
  15. python早读读后感_《学习Python》读后感摘抄
  16. 苏宁小BIU诞生日 机器人员工正式“入职”
  17. linux之cut的使用
  18. 如何做好企业网络营销推广?从本质上去理解互联网开始!
  19. K2 BPM_【解决方案】从“制造”到“智造”,K2推动制造业转型升级_业务流程管理系统...
  20. iPhone微信防止撤销插件开发

热门文章

  1. spark sql读写hive的过程
  2. AcWing 774. 最长单词
  3. 【优秀的素材收藏管理工具】Inboard for Mac 1.1
  4. 题目+思路(一句话开脑洞)
  5. [网络安全学习篇7]:域(千峰网络安全视频笔记 7 day)
  6. 《Android 美颜类相机开发汇总》第五章 Android OpenGLES 美颜定制实现
  7. 资源整理 | 36个惊人的Python开源项目,都在这了
  8. 华为云开发者联盟助力培养数字化人才,加速应用构建质效提升
  9. JS的句末分号:你可能不了解的事实
  10. ajaxsetup无效_javascript – $.ajaxSetup无效