HN0I2000最优乘车 (最短路变形)
HN0I2000最优乘车 (最短路变形)
版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址!
【试题】为了简化城市公共汽车收费系统,某城市决定对大部分的公共汽车都采用一票制,但由于某些公共汽车所经过的停车站太多和路途太长,就采用两票或多票制。经过这种票制改革后,人们坐公共汽车从一个站到另一个站时,就不得不选择一个好的乘车方案,以使他们的乘车费用最低。
为了方便于求出最佳的乘车方案,我们假设:
l 采用一票制的公共汽车,无论从哪个站上车到那个站下车,乘该公共汽车的费用为1(费用单位)。
l 采用多票制的公共汽车,将设立某些站为关键站;那么,如果某人乘该路公共汽车从A站到B站时,不经过任何关键站的乘车费用为1,而经过K个关键站的乘车费用为K+1;所谓经过关键站是指:乘该路公共汽车时,该关键站是其途中的一个站,但它不是上车站也不是下车站;例如,某路公共汽车经过1,2,3,4,*5,6,7,8,9;其中5是关键站,那么,从5站上车到9站下车或从2站上车到5站下车的费用为1,而从4站上车到6站下车的费用将是2。
l 所有公共汽车都是双向行驶的,也即如果公共汽车经过的站点有A和B,那么,你可以乘该公共汽车从A到B或从B到A。
你的任务就是:对于输入文件中给出的公共汽车各停车站,和某乘客的起点站A和终点站B,请你编程为乘客求出最佳的乘车方案,使得他的乘车费用最少。
输入:第1行为N、R、A和B,其中N为城市公共汽车停车站的总个数,这些停车站被统一编号为1、2、……、N;R为公共汽车总路数。A为起点站的编号,B为终点站的编号。(1≤N≤1000,1≤R≤300,每路公共汽车的最多站点数为20)。数据之间用空格分开。
第2行到R+1行的每一行为一路公共汽车经过的停车站编号,停车站编号的排列顺序是该路公共汽车按一个方向行车顺序依次经过的停车站,如为关键停车站,则其编号的前面有一个*。每行数据之间用空格分开。
输出:从A站到B站所需的最少费用。如果不能乘这些公共汽车从A到B,输出-1。
输入输出示例:
INPUT4.TXT
12 4 1 12
1 2 3 *4 5 6 7
1 2 3 8
8 4 5 9
7 6 5 *9 10 11 12
OUTPUT4.TXT
3
解题报告
好稀有的题目,在网上根本找不到的说。
很典型的最短路。对于每一条公交线路,我们让其中的每一个站点互相建边,使其权值为票价,注意边界问题,起点与终点为关键站不计入票价中。
用堆优dijkstra即可。
#include<bits/stdc++.h>
#define Pair pair<int,int>
#define MAXN 1000+10
#define MAXM 600000+1
using namespace std;
int n,m,num,head[MAXN],s,t,dis[MAXN],v[MAXM];
int pre[MAXN]; int read(int &k)
{
int in=,j=;char c;
c=getchar();
for(;c>''||c<'';c=getchar())
{
if(c=='\n') return ;
if(c=='*') j=;
}
for(;c<=''&&c>='';c=getchar()) in=in*+c-'';
k=in;
if(j) return ;
return ;
} struct Edge{
int dis,next,to,exi,from;
}edge[MAXM]; void add(int from,int to,int dis)
{
edge[++num].next=head[from];
edge[num].to=to;
edge[num].dis=dis;
edge[num].from=from;
head[from]=num;
edge[num].exi=;
}
void dij()
{
memset(dis,,sizeof(dis));
memset(v,,sizeof(v));
priority_queue<Pair,vector<Pair>,greater<Pair> > h;
for(int i=;i<=n;i++) dis[i]=;
dis[s]=;
h.push(Pair(dis[s],s));
while(h.size()>)
{
int k=h.top().second;h.pop();
if(v[k]) continue;
v[k]=;
for(int i=head[k];i;i=edge[i].next)
if(dis[k]+edge[i].dis<dis[edge[i].to]&&edge[i].exi==)
{
dis[edge[i].to]=dis[k]+edge[i].dis;
h.push(Pair(dis[edge[i].to],edge[i].to));
pre[edge[i].to]=edge[i].from;
}
}
} int main()
{
freopen("bus.in","r",stdin);
freopen("bus.out","w",stdout); scanf("%d%d%d%d\n",&n,&m,&s,&t);
for(int i=;i<=m;i++)
{
int x,o,np=;int p[MAXN][],k=;
while()
{
o=read(x);if(o==) break;
else if(o==) p[++np][]=x,p[np][]=k,k++,p[np][]=k;
else p[++np][]=x,p[np][]=p[np][]=k;
}
for(int i=;i<=np;i++)
{
for(int j=+i;j<=np;j++)
{ int money=min( min(abs(p[i][]-p[j][]),abs(p[i][]-p[j][]))
,min(abs(p[i][]-p[j][]),abs(p[i][]-p[j][])));
add(p[i][],p[j][],money+);
add(p[j][],p[i][],money+); }
}
} dij(); if(dis[t]>=) printf("-1\n");
else printf("%d\n",dis[t]);
return ;
}
HN0I2000最优乘车 (最短路变形)的更多相关文章
- POJ 2253 Frogger ( 最短路变形 || 最小生成树 )
题意 : 给出二维平面上 N 个点,前两个点为起点和终点,问你从起点到终点的所有路径中拥有最短两点间距是多少. 分析 : ① 考虑最小生成树中 Kruskal 算法,在建树的过程中贪心的从最小的边一个 ...
- POJ-2253.Frogger.(求每条路径中最大值的最小值,最短路变形)
做到了这个题,感觉网上的博客是真的水,只有kuangbin大神一句话就点醒了我,所以我写这篇博客是为了让最短路的入门者尽快脱坑...... 本题思路:本题是最短路的变形,要求出最短路中的最大跳跃距离, ...
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
- POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...
- 1722 最优乘车 1997年NOI全国竞赛
题目描述 Description H城是一个旅游胜地,每年都有成千上万的人前来观光.为方便游客,巴士公司在各个旅游景点及宾馆,饭店等地都设置了巴士站并开通了一些单程巴上线路.每条单程巴士线路从某个巴士 ...
- noi 1997 最优乘车
H城是一个旅游胜地,每年都有成千上万的人前来观光.为方便游客,巴士公司在各个旅游景点及宾馆,饭店等地都设置了巴士站并开通了一些单程巴上线路.每条单程巴士线路从某个巴士站出发,依次途经若干个巴士站,最终 ...
- POJ-1797Heavy Transportation,最短路变形,用dijkstra稍加修改就可以了;
Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K Description Background Hugo ...
- HDOJ find the safest road 1596【最短路变形】
find the safest road Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- 天梯杯 PAT L2-001. 紧急救援 最短路变形
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求 ...
随机推荐
- HDU 5273 Dylans loves sequence【 树状数组 】
题意:给出n个数,再给出q个询问,求L到R的逆序对的个数 先自己写的时候,是每次询问都重新插入来求sum(r)-sum(l) 果断T 后来还是看了别人的代码---- 预处理一下,把所有可能的区间的询问 ...
- angular.js学习-ng-grid
ng-grid是基于AngularJS和JQuery的富表格控件,由AngularUI Team领衔开发,到目前为止已有2354次Commit,1076个Fork. AngualrUI:http:/ ...
- 3ds Max制作厨房贴图和纹理实例
来源:CG游 使用软件:3ds Max 软件下载:www.xy3dsmax.com/xiazai.html 大家好,欢迎大家来阅读这个教程.这个教程是讲解我前不久制作的一个场景效果图.因为场景已经制作 ...
- set集合关于set与set进行比较
containsAll方法用来判断Set集合是否包含另一个集合中的全部内容. 语法 boolean containsAll(Collection<?> c) 返回值:如果Set集合包含参 ...
- 拓展Lucas小结
拓展Lucas是解决大组合数取模非质数(尤其是含平方因子的合数)问题的有力工具... 首先对模数质因数分解,把每个质因子单独拎出来处理答案,然后用中国剩余定理(excrt)合并 问题转化为,对于每个质 ...
- thinkphp5 编辑时 唯一验证 解决办法
若定义了相关的验证规则,如: namespace app\seller\validate; use think\Validate; class Goodsmtag extends Validate { ...
- ajax前台传到后台乱码,显示问号的问题
response.setContentType("text/html;charset=gbk"); response.setHeader("Cache-Control&q ...
- hadoop-16-sqoop导入oracle数据
sqoop = sql + hadoop 1,系统方面的准备 scp ./ojdbc6.jar root@server-1:/usr/hdp/2.6.0.3-8/sqoop/lib/scp ./ojd ...
- WinCE的C#中使用StreamReader 来读取TXT文档,读取文本文档。
using System.IO; private void button1_Click(object sender, EventArgs e) { string strFilePath = " ...
- HDOJ1084 What Is Your Grade?
What Is Your Grade? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...