TCO之旅

时间限制: 1 Sec  内存限制: 128 MB
提交: 77  解决: 24
[提交][状态][讨论版]

题目描述

我们的小强终于实现了他TCO的梦想了,爬进了TCO的全球总决赛,开始了他的 
American之旅,去和TC的titan们去同场竞技去了,这可把小强给乐坏了。。。 
由于在American人身地不熟,我们的小强遇到了很大的麻烦,他一下子找不到了比赛的地点,我们可以把交通网络这样进行简化。总共有n个城市,编号从0到n-1,我们的小强现在在标号为0的城市,他要到标号为n-1的城市去的。对于每个城市i,都有一个值cellprice[i]表示到这个城市的代价,如果是-1,就表示无法到达这个城市。在城市i中,存在着到城市i-1和城市i+1的直达车,代价分别为cellprice[i-1]和cellprice[i+1]。在某些城市之间又存在这特殊的城际班车。Entercell[i]表示第i条特殊的城际班车所在的起点城市,exitcell[i]表示第i条特殊的城际班车所在的终点城市。每次乘坐这种特殊的城市班车时所需的代价是price+x,这里的price是个定值,x表示你先前已经乘坐过特殊的城际班车的次数,当你乘坐特殊的城际班车到达某座城市i时,你就不需要花费cellprice[i]。 
为了节省花费和时间,我们需要找出一条最优的乘车线路。当然,这个肯定难不倒我们的小强,毕竟是TCO总决赛的选手,这个简直是切菜的活。但现在他就来这里考考你,看你是否有进入TCO world final的能力。他要求首先花费要最少,在花费最少的前提下,要求乘坐的车的次数尽量的少。

输入

每组四行:第一行有个1到50个大于等于-1的整数,即cellprice 
第二行有0到50个整数 ,表示特殊的城际班车的出发点, 即entercell 
第三行有0到50个整数, 表示上一行所对应的特殊的城际班车的终点, 即exitcell 
第四行非负的整数表示 price 
我们保证输入的数据是正确的,以上所有的整数均在-1到1000之间,并且出发点的cellprice肯定是非负的。

输出

两个整数 ,分别表示最小的花费和在这种花费下的最小乘车次数,并用一个空格隔开。 如果无法到达终点,则输出-1 -1 ;

样例输入

4 2 1 0 5 6 0 3 0
4 4 3 7 5 4 2 5 8 4
7 3 5 0 5 4 5 0 8 3
8

样例输出

14 6

提示

数据是分文件的,第二行和第三行可能是空行

这个也是比较简单的,难就难在如何想到这个思想,最短路的点扩展成为两维,各层之间只有相互的点可以到达,然后相邻两层之间用特殊路径到达,这样建图即可。

 #include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<queue>
using namespace std; typedef pair<int,int>fzy;
const int INF=1e8+,NN=,MM=NN*NN; int n,m,a[NN],st[NN],ed[NN],price;
int cnt,head[NN],rea[MM],next[MM],val[MM],dis[NN][NN],skp[NN][NN];
bool flag[MM],stack[NN][NN];
queue<fzy>p;
string s; void add(int u,int v,int fee)
{
cnt++;
next[cnt]=head[u];
head[u]=cnt;
rea[cnt]=v;
val[cnt]=fee;
}
void init()
{
cnt=;
memset(head,-,sizeof(head));
getline(cin,s);
int i=;
while (i<s.size())
{
int x=,f=;
while ((s[i]<''||s[i]>'')&&i<s.size()) {if (s[i]=='-') f=-;i++;}
while (s[i]>=''&&s[i]<=''&&i<s.size()) x=x*+s[i]-'',i++;
n++,a[n]=x*f;
}
getline(cin,s);
i=;
while (i<s.size())
{
int x=,f=;
while ((s[i]<''||s[i]>'')&&i<s.size()) {if (s[i]=='-') f=-;i++;}
while (s[i]>=''&&s[i]<=''&&i<s.size()) x=x*+s[i]-'',i++;
m++,st[m]=x;
}
for (int i=;i<=m;i++)
st[i]++;
getline(cin,s);
i=m=;
while (i<s.size())
{
int x=;
while (s[i]>=''&&s[i]<='') x=x*+s[i]-'',i++;
while ((s[i]<''||s[i]>'')&&i<s.size()) i++;
m++,ed[m]=x;
}
for (int i=;i<=m;i++) ed[i]++;
scanf("%d",&price);
for (int i=;i<n;i++)
if (a[i+]>=) add(i,i+,a[i+]);
for (int i=n;i>;i--)
if (a[i-]>=) add(i,i-,a[i-]);
for (int i=;i<=m;i++)
if (a[ed[i]]!=-) add(st[i],ed[i],price),flag[cnt]=;
}
void spfa()
{
memset(dis,,sizeof(dis));
dis[][]=,stack[][]=; int hd=,tl=;
p.push(make_pair(,));
while (!p.empty())
{
fzy now=p.front();
p.pop();
int u=now.first,t=now.second;
for (int i=head[u];i!=-;i=next[i])
{
int v=rea[i];
if (flag[i])
{
if (dis[v][t+]>dis[u][t]+val[i]+t&&t<m)
{
dis[v][t+]=dis[u][t]+val[i]+t;
skp[v][t+]=skp[u][t]+;
if (!stack[v][t+])
{
stack[v][t+]=;
p.push(make_pair(v,t+));
}
}
else if (dis[v][t+]==dis[u][t]+val[i]+t) skp[v][t+]=min(skp[v][t+],skp[u][t]+);
}
else if (dis[v][t]>dis[u][t]+val[i])
{
dis[v][t]=dis[u][t]+val[i];
skp[v][t]=skp[u][t]+;
if (!stack[v][t])
{
stack[v][t]=;
p.push(make_pair(v,t));
}
}
else if (dis[v][t]==dis[u][t]+val[i]) skp[v][t]=min(skp[v][t],skp[u][t]+);
}
stack[u][t]=;
}
}
int main()
{
init();
spfa(); int ans1=INF,ans2=INF;
for (int i=;i<=m;i++)
if (dis[n][i]<ans1) ans1=dis[n][i],ans2=skp[n][i];
else if (dis[n][i]==ans1) ans2=min(ans2,skp[n][i]);
if (ans1==INF) printf("-1 -1\n");
else printf("%d %d\n",ans1,ans2-);
}

TCO之旅的更多相关文章

  1. 一条数据的HBase之旅,简明HBase入门教程-开篇

    常见的HBase新手问题: 什么样的数据适合用HBase来存储? 既然HBase也是一个数据库,能否用它将现有系统中昂贵的Oracle替换掉? 存放于HBase中的数据记录,为何不直接存放于HDFS之 ...

  2. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  3. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

  4. 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法

    若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...

  5. Hadoop学习之旅二:HDFS

    本文基于Hadoop1.X 概述 分布式文件系统主要用来解决如下几个问题: 读写大文件 加速运算 对于某些体积巨大的文件,比如其大小超过了计算机文件系统所能存放的最大限制或者是其大小甚至超过了计算机整 ...

  6. .NET跨平台之旅:在生产环境中上线第一个运行于Linux上的ASP.NET Core站点

    2016年7月10日,我们在生产环境中上线了第一个运行于Linux上的ASP.NET Core站点,这是一个简单的提供后端服务的ASP.NET Core Web API站点. 项目是在Windows上 ...

  7. 【Knockout.js 学习体验之旅】(3)模板绑定

    本文是[Knockout.js 学习体验之旅]系列文章的第3篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knoc ...

  8. 【Knockout.js 学习体验之旅】(2)花式捆绑

    本文是[Knockout.js 学习体验之旅]系列文章的第2篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knoc ...

  9. 【Knockout.js 学习体验之旅】(1)ko初体验

    前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...

随机推荐

  1. .net中html转pdf

    最近研究了2天如何把html转为pdf保存的方法,网上找了好多解决方案.总结下来也就是2种 一种是使用js的插件 jspdf  这款插件我试了下,很强大  使用起来也很简单,唯一 一点不好的就是转成p ...

  2. 常用bash命令

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...

  3. hdu 6068--Classic Quotation(kmp+DP)

    题目链接 Problem Description When online chatting, we can save what somebody said to form his ''Classic ...

  4. 边看MHA源码边学Perl语言之一开篇

    边看MHA源码边学Perl语言之一开篇 自我简介 先简单介绍一下自己,到目前为此我已经做了7年左右的JAVA和3年左右php开发与管理,做java时主要开发物流行业的相关软件,对台湾快递,国际快递,国 ...

  5. echarts用法

    参考文档: https://github.com/xlsdg/vue-echarts-v3 1.下载echarts插件 $ npm install --save vue-echarts-v3 2.引入 ...

  6. C++ 将函数作为形参

    今天偶然看到一段代码,其中将函数作为形参进行设计,一开始不理解,自己试了一下,发现果然可行 #include <iostream> using namespace std; void vi ...

  7. poj 1882完全背包变形

    题意:给出一个上限硬币数量s,给出n套硬币价值,求一套硬币能用不大于s数量的硬币组成从1开始连续的区间价值,其中,如果其最大值相同,输出数量小的和价值小的. 思路:很明显的完全背包,纠结后面最大值相同 ...

  8. Nhibernate学习教程(2)-- 第一个NHibernate程序

    NHibernate之旅(2):第一个NHibernate程序 本节内容 开始使用NHibernate 1.获取NHibernate 2.建立数据库表 3.创建C#类库项目 4.设计Domain 4- ...

  9. 定宽块状元素居中 1记(text-align/margin:0 auto)

    对于text-align:center的用法只是针对文本相对于父元素的居中,例如: #jz2{ width:300px; margin: 10px auto; border:2px solid red ...

  10. jQuery的less和scss之less的基本介绍(一)

    简单的整理了一下less的基本用法,希望对大家有所帮助ㅎㅎ 一.less基础语法 1.声明变量:@变量名:变量值 使用变量:@变量名 例如 @color : #ff0000; @length : 10 ...