题目:

Sample Input
1
a Z
19 a Z
5
A D
D X
A b
b c
c X
39 A X
-1
Sample Output
Case 1:
20
a-Z
Case 2:
44
A-b-c-X

题意:

  有两种节点,一种是大写字母,一种是小写字母。首先输入m条边,当经过小写字母时需要付一单位的过路费,当经过大写字母时,要付当前财务的1/20做过路费(向上取整)。问在起点最少需要带多少物品使到达终点时还有k个物品。当有多条符合条件的路径时输出字典序最小的一个。

分析:

  逆推进行最短路,输出时顺序输出并选择最小字典序即可。(超级讨厌字符输入有没有,TAT,RE好多遍,记得要long long)

代码如下:

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
#define Maxn 10100
#define LL long long int s,e; struct node
{
int x,y,next;
}t[**Maxn];int len; int first[Maxn];
LL dis[Maxn];
bool inq[Maxn]; queue<int > q; void ins(int x,int y)
{
t[++len].x=x;t[len].y=y;
t[len].next=first[x];first[x]=len;
} int mymin(int x,int y) {return x<y?x:y;} void spfa(int s,int w)
{
memset(dis,,sizeof(dis));
memset(inq,,sizeof(inq));
while(!q.empty()) q.pop();
dis[s]=w;inq[s]=;q.push(s);
while(!q.empty())
{
int x=q.front();q.pop();inq[x]=;
LL now;
if(x>) now=dis[x]+;
else now=(LL)ceil(dis[x]*1.0*/);
for(int i=first[x];i;i=t[i].next)
{
int y=t[i].y;
if(dis[y]>now)
{
dis[y]=now;
if(!inq[y])
{
q.push(y);
inq[y]=;
}
}
}
}
} void pri(int x)
{
if(x>) printf("%c",x-+'a');
else printf("%c",x-+'A'); }
void ffind(int x,int z)
{
pri(x);
if(x==z) return;printf("-");
int mn=;
LL a,b;
a=dis[x]-;
b=dis[x]-(LL)ceil(dis[x]*1.0/);
for(int i=first[x];i;i=t[i].next)
{
int y=t[i].y;
if(y==x) continue;
LL now;
if(y<=) now=b;
else now=a;
if(now==dis[y]) mn=mymin(mn,y);
}
if(mn<) ffind(mn,z);
} int main()
{
int n,kase=;
while()
{
scanf("%d",&n);getchar();
if(n==-) break;
char a,b,c;
int x,y;
memset(first,,sizeof(first));
len=;
for(int i=;i<=n;i++)
{
scanf("%c%c%c",&a,&c,&b);getchar();
if(a>='a'&&a<='z') x=a-'a'+;
else x=a-'A'+;
if(b>='a'&&b<='z') y=b-'a'+;
else y=b-'A'+;
ins(x,y);ins(y,x);
}
int p;scanf("%d%c%c%c%c",&p,&c,&a,&c,&b);getchar();
if(a>='a'&&a<='z') x=a-'a'+;
else x=a-'A'+;
if(b>='a'&&b<='z') y=b-'a'+;
else y=b-'A'+;
spfa(y,p);
printf("Case %d:\n",++kase);
printf("%lld\n",dis[x]);
ffind(x,y);printf("\n");
}
return ;
}

[UVA10537]

2016-04-06 13:35:13

【UVA10537】The Toll! Revisited (逆推最短路)的更多相关文章

  1. UVA 10537 The Toll! Revisited 过路费(最短路,经典变形)

    题意:给一个无向图,要从起点s运送一批货物到达终点e,每个点代表城镇/乡村,经过城镇需要留下(num+19)/20的货物,而经过乡村只需要1货物即可.现在如果要让p货物到达e,那么从起点出发最少要准备 ...

  2. UVA-10537 The Toll! Revisited (dijkstra)

    题目大意:每经过一个地方就要交出相应的货物作为过路费,问将一批货物从起点运到终点,最少需要携带多少货物? 题目分析:在每一站交的过路费由当前拥有的货物量来决定,所以,要以终点为源点,求一次单源最短路即 ...

  3. UVA 10537 Toll! Revisited (逆推,最短路)

    从终点逆推,d[u]表示进入u以后剩下的货物,那么进入u之前的货物数量设为y,d[u] = x,那么y-x=ceil(y/20.0)=(y-1)/20+1=(y+19)/20. (y-x)*20+r= ...

  4. UVa 10537 The Toll! Revisited (最短路)

    题意:给定一个图,你要从 s 到达 t,当经过大写字母时,要交 ceil(x /20)的税,如果经过小写字母,那么交 1的税,问你到达 t 后还剩下 c 的,那么最少要带多少,并输出一个解,如果多个解 ...

  5. UVA10537 Toll! Revisited

    difkstra + 路径输出 The Toll! Revisited Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...

  6. uva10537 dijkstra + 逆推

    21:49:45 2015-03-09 传送 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8& ...

  7. UVA116Unidirectional TSP(DP+逆推)

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18206 题意:M*N的数阵,从左边一列到右边一列走过的数的和的最小.并输出路 ...

  8. UVA 10537 - The Toll! Revisited(dijstra扩张)

    UVA 10537 - The Toll! Revisited option=com_onlinejudge&Itemid=8&page=show_problem&catego ...

  9. HDU 5844 LCM Walk(数学逆推)

    http://acm.hdu.edu.cn/showproblem.php?pid=5584 题意: 现在有坐标(x,y),设它们的最小公倍数为k,接下来可以移动到(x+k,y)或者(x,y+k).现 ...

随机推荐

  1. iOS CoreData (1)

    下面开始学习一下CoreData. Core Data不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS). Core Data 为数据变更管理.对象存储.对象读取恢复的功能提供了支持. 它 ...

  2. 汇编语言-[BX]和loop指令

    汇编语言-[BX]和loop指令 [BX]指令介绍 mov ax,[bx] 功能: bx为偏移地址,段地址默认为ds.因此,上面指令作用就是将ax中的数据送入内存ds:bx处,即:((ds)*16 + ...

  3. rpm安装mysql 默认安装目录

    MySQL安装完成后不象SQL Server默认安装在一个目录,它的数据库文件.配置文件和命令文件分别在不同的目录,了解这些目录非常重要,尤其对于Linux的初学者,因为Linux本身的目录结构就比较 ...

  4. java数组 数组工具类Arrays

    一.数组 1.java有严格的数据类型限制,一个数组只能声明一个数据类型,存放同一种数据类型. 2.虽然只能存放一种数据类型,假设A , 如果数据类型B 继承A,依然能存放进入数组. 3.数组的初始化 ...

  5. java String的比较,BOX装箱拆箱,以及面向对象的小代码

    package cn.hncu.day2; public class StringDemo { public static void main(String[] args) { String str1 ...

  6. 第一篇:杂项之pymysql连接池

    杂项之pymysql连接池   杂项之pymysql连接池 本节内容 本文的诞生 连接池及单例模式 多线程提升 协程提升 后记 1.本文的诞生 由于前几天接触了pymysql,在测试数据过程中,使用普 ...

  7. VS2010调试多进程--医疗His调试中使用

    有些时候碰到自己开发的程序嵌入到别人的框架中,而在接口的地方出了问题,而又不方便将自己的模快加入到别人的工程中这个时候VS的附加到进程调试变得不可或缺了,直奔主题 http://msdn.micros ...

  8. web开发基础(同步更新中)

    1/Get与Post的区别 GET是我们都熟悉的.它用于请求网页文本.当你在浏览器输入harvard.edu,它会直接访问Harvard的web服务器,去GET /. 第二个最有名的是POST,它经常 ...

  9. 从ZOJ2114(Transportation Network)到Link-cut-tree(LCT)

    [热烈庆祝ZOJ回归] [首先声明:LCT≠动态树,前者是一种数据结构,而后者是一类问题,即:LCT—解决—>动态树] Link-cut-tree(下文统称LCT)是一种强大的数据结构,不仅可以 ...

  10. Git (2)

    要使用Git首先遇到的问题是怎么把文件加到库中. 很简单. 新建一个目录,然后git init. 完成上述工作之后的唯一改动是在当前目录下生成了一个.git的子目录.这个子目录是一个集中的数据库,包含 ...