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. 紧急救援 最短路变形
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求 ...
随机推荐
- RXjava的简介
API 介绍和原理简析 1. 概念:扩展的观察者模式 观察者模式面向的需求是:举一个例子,警察在小偷实施作案的时候实施抓捕,在这一个例子中警察是观察者,小偷是被观察者.但是程序的观察者模式和这个还是有 ...
- ZOJ 3321 Circle【并查集】
解题思路:给定n个点,m条边,判断是否构成一个环 注意到构成一个环,所有点的度数为2,即一个点只有两条边与之相连,再有就是判断合并之后这n个点是否在同一个连通块 Circle Time Limit: ...
- swift语言点评一
一.变量定义 1.常量与变量 Use let to make a constant and var to make a variable. 2.类型与推测 However, you don’t alw ...
- ActiveMQ学习笔记(19)----Consumer高级特性(一)
1. Exclusive Consumer 独有消费者:Queue中的消息是按照顺序被分发到consumer的,然而,当你有多个consumers同时从相同的queue中提取消息时,你将失去这个保证. ...
- js效果之导航中英文转换
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- cx-oracle-------------------安装
这个东西弄完就报错.... 这个是Oracle官方的方法:https://oracle.github.io/odpi/doc/installation.html#windows 然而,你懂的,不能用啊 ...
- NodeJS学习笔记 (4)网络服务-http(ok)
原文:https://github.com/chyingp/nodejs-learning-guide 自己敲代码: http模块概览 大多数nodejs开发者都是冲着开发web server的目的选 ...
- Linux 操作基础(一) -- Shell 命令格式和元字符
1 命令格式 cmd [-选项] [参数] 说明: • 最简单的Shell命令只有命令名,复杂的Shell命令可以有多个选项和参数 • 参数是文件也可以是目录,有些命令必须使用多个操作对象 • 并非所 ...
- 紫书 例题 11-13 UVa 10735(混合图的欧拉回路)(最大流)
这道题写了两个多小时-- 首先讲一下怎么建模 我们的目的是让所有点的出度等于入度 那么我们可以把点分为两部分, 一部分出度大于入度, 一部分入度大于出度 那么显然, 按照书里的思路,将边方向后,就相当 ...
- Solr DataImportHandler 配置
DIH主要用于从数据库抓取数据并创建索引.另外还能够从HTTP(RSS.ATOM)拉数据. 相关概念: Datasource:数据源,包含获取数据必需的信息:数据位置(url).数据库driver.登 ...