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. C++ 用lambda代替 unique_ptr 的Deleter

    C++ 用lambda代替 unique_ptr 的Deleter 代码 #include <iostream> #include <cstdlib> #include < ...

  2. 初遇.net

    初遇.net 为了自己的理想我选择了.net课程进行自我提升,想想以后能成为一位程序猿不由得有点兴奋呢,还有另一件高兴的事是我认识了十几位来自不同区县的老师同学,都说人脉就是财富,是不是我的财富有多了 ...

  3. css中使用变量

    2017年3月,微软宣布 Edge 浏览器将支持 CSS 变量.这个重要的 CSS 新功能,所有主要浏览器已经都支持了. 声明css变量的时候,变量名前面要加两根连词线(--).变量名大小写敏感,-- ...

  4. poj 3592 缩点+SPFA

    题意:给出一个矩阵,其中#代表墙,不可走,0-9代表权值,*代表可以选择传送.求从0,0点开始出发能获得最大权值. 思路:因为*的出现会有环的情况,先建图连边,将环进行Tarjan缩点,之后再从0,0 ...

  5. angularjs自定义指令实现分页插件

    由于最近的一个项目使用的是angularjs1.0的版本,涉及到分页查询数据的功能,后来自己就用自定义指令实现了该功能.现在单独做了个简易的小demo,主要是为了分享自己写的分页功能.注:本实例调用的 ...

  6. 二,ESP8266 GPIO和SPI和定时器和串口

    让这个灯亮 我们写lua用这个软件 链接:http://pan.baidu.com/s/1kVN09cr 密码:pfv7 http://www.cnblogs.com/yangfengwu/p/624 ...

  7. 玩转PS路径,轻松画logo!

    轻松画图标!教你一分钟玩转PS路径描边 推荐: cyRotel    2014/11/24    in PS 教程 & 设计文章    @Micu设计 :Photoshop的路径工具和钢笔工具 ...

  8. js中防止全局变量被污染的方法

    (function ($){ var oDiv = $('div1');//获取id为'div1'的页面元素 })(function $(id){ return document.getElement ...

  9. 201521123095 《Java程序设计》第2周学习总结

    1. 本周学习总结 学会了使用码云管理代码,使用eclipse关联jdk源代码: 还学习了Java语言中各种数据类型以及运算符. 2. 书面作业 1.使用Eclipse关联jdk源代码,并查看Stri ...

  10. [转载]sqlserver、Mysql、Oracle三种数据库的优缺点总结

    一.sqlserver优点:易用性.适合分布式组织的可伸缩性.用于决策支持的数据仓库功能.与许多其他服务器软件紧密关联的集成性.良好的性价比等:为数据管理与分析带来了灵活性,允许单位在快速变化的环境中 ...