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. Java序列化详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt228 以前在使用hibernate时候,domain域模型的JavaBean ...

  2. NHibernte教程(10)--关联查询

    本节内容 关联查询引入 一对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 关联查询引入 在NHibernate中提供了三种查询方式给我们选择:NH ...

  3. H5-html基础

    什么是 HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (ma ...

  4. CCNA基础知识摘录

    cisco设备的启动要点: 1.检测硬件(保存在rom) 2.载入软件(IOS)(保存在Flash) 3.调入配置文件(密码,IP地址,路由协议都保存在此)(此文件保存在NVRAM) 0x2102:正 ...

  5. (3)ES6解构赋值-对象篇

    对象的解构赋值(可以不按顺序,但是key必须一样否则为undefined) //demo1 var {name,age} = { name: "Jewave", age:26 }; ...

  6. 【Alpha】 第七次Daily Scrum Meeting

    一.本次会议为第七次meeting会议 二.时间:9:37AM-9:50AM 地点:禹州三楼 三.会议站立式照片 四.今日任务 成员 昨日任务 今日任务 林清青 学习并了解微信程序相关方面知识,为小组 ...

  7. 201521123059 《Java程序设计》第四周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 参考资料: 百度脑图 XMind 1.2 使用常规方法总结其他上课内容. 1.多态性就是相同的形态,不同的行为(不同的定义).多态就 ...

  8. 201521123056 《Java程序设计》第4周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 1.1 instanceof 测试一个对象是否是某个类的实例,即使左边是右边类的子类的实例对 ...

  9. 201521123001《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  10. 201521123012 《Java程序设计》第十四周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 1.1建立数据库,将自己的姓名.学号作为一条记录插入.(截图, ...