从终点逆推,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=y+19,0≤r≤19,即19*y=20*x+r,根据题意y应该尽量小,x的部分是不能变动的,所以y=x+ceil(x/19.0)。

然后从起点找一条字典序最小的路径即可,因为每个字母都是独一无二的,所以不必bfs,每次记录一个点就够了。

#include<bits/stdc++.h>
using namespace std; const int maxn = , maxm = maxn*maxn, town = , village = ;
bool g[maxn][maxn];
int head[maxn],nxt[maxm],to[maxm],ecnt;
int tp[maxn];
int id[];
char rid[]; void addEdge(int u,int v)
{
to[ecnt] = v;
nxt[ecnt] = head[u];
head[u] = ecnt++;
}
int id_cnt; void init()
{
memset(head,-,sizeof(head));
memset(id,-,sizeof(id));
memset(g,,sizeof(g));
ecnt = ;
id_cnt = ;
} inline int ID(char c) {
if(~id[c]) return id[c];
id[c]= id_cnt;
rid[id_cnt] = c;
tp[id_cnt] = 'a'<=c&&c<='z';//写成isalpha(c)-1;WA了
return id_cnt++;
}
typedef long long ll;
typedef pair<ll,int> Node;
#define fi first
#define se second ll d[maxn];
void dijkstra(int s,ll p)
{
memset(d,0x7f,sizeof(d));
priority_queue<Node,vector<Node>,greater<Node> > q;
q.push(Node(d[s] = p,s));
while(q.size()){
Node x = q.top(); q.pop();
int u = x.se;
if(d[u] != x.fi) continue;
ll t = (tp[u]?(+d[u]):((d[u]+)/+d[u]));
for(int i = head[u]; ~i; i = nxt[i]){
int v = to[i];
if(d[v] > t ){
q.push(Node(d[v]= t,v));
}
}
}
} ll cost(int u,int v)
{
return tp[v]?:((d[u]+)/);
} void FindPath(int s,int e)
{
int u = s;
while(u != e){
printf("%c-",rid[u]);
int nex = -;
for(int i = head[u]; ~i; i = nxt[i]){
int v = to[i];
if(d[u]- cost(u,v) >= d[v]){
if(~nex) {
if(rid[v] < rid[nex]) nex = v;
}else nex = v;
}
}
swap(nex,u);
}
printf("%c\n",rid[e]);
} int main()
{
//freopen("in.txt","r",stdin);
int n;
char a[],b[];
int kas = ;
while(scanf("%d",&n),~n){
init();
while(n--){
scanf("%s%s",a,b);
int u = ID(*a), v = ID(*b);
if(!g[u][v]){
g[u][v] = g[v][u] = true;
addEdge(u,v); addEdge(v,u);
}
}
ll p;
scanf("%lld%s%s",&p,a,b);
int s = ID(*a),e = ID(*b);
dijkstra(e,p);
printf("Case %d:\n%lld\n",++kas,d[s]);
FindPath(s,e);
}
return ;
}

UVA 10537 Toll! Revisited (逆推,最短路)的更多相关文章

  1. uva 10537 Toll! Revisited(优先队列优化dijstra及变形)

    Toll! Revisited 大致题意:有两种节点,一种是大写字母,一种是小写字母. 首先输入m条边.当经过小写字母时须要付一单位的过路费.当经过大写字母时,要付当前財务的1/20做过路费. 问在起 ...

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

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

  3. 【UVA10537】The Toll! Revisited (逆推最短路)

    题目: Sample Input1a Z19 a Z5A DD XA bb cc X39 A X-1Sample OutputCase 1:20a-ZCase 2:44A-b-c-X 题意: 有两种节 ...

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

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

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

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

  6. Uva 10537 过路费

    题目链接:http://vjudge.net/contest/143062#problem/C 题意: 给定一个无向图,大写字母是城市,小写字母是村庄,经过城市交过路费为当前货物的%5,路过村庄固定交 ...

  7. uva10537 dijkstra + 逆推

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

  8. UVA116Unidirectional TSP(DP+逆推)

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

  9. UVA10537 Toll! Revisited

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

随机推荐

  1. select2,利用ajax高效查询大数据列表(可搜索、可分页)

    二.导入css和js到网站上 1.使用CDN,节省自己网站的流量 ? 1 2 <link href="https://cdnjs.cloudflare.com/ajax/libs/se ...

  2. 获得HttpWebResponse请求的详细错误内容

    try { } catch (WebException ex) { HttpWebResponse response = (HttpWebResponse)ex.Response; Console.W ...

  3. [Xcode 实际操作]六、媒体与动画-(6)使用UIBlurEffect给图片添加模糊效果

    目录:[Swift]Xcode实际操作 本文将演示如何给图像添加模糊效果. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class V ...

  4. [Xcode 实际操作]六、媒体与动画-(7)遍历系统提供的所有滤镜

    目录:[Swift]Xcode实际操作 本文将演示系统到底提供了多少滤镜供开发者使用,并了解每个滤镜都有哪些参数需要配置. 在项目导航区,打开视图控制器的代码文件[ViewController.swi ...

  5. IT兄弟连 JavaWeb教程 过滤器1

    Servlet过滤器是从Servlet2.3规范开始新增的功能,并在Servlet2.4规范中得到增强,监听器可以监听到Web应用程序启动和关闭.创建过滤器和监听器需要继承相应接口,并对其进行配置. ...

  6. 剑指Offer的学习笔记(C#篇)-- 二叉搜索树的后序遍历序列

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 一 . 解题思想与二叉搜索树概念 (1). 二叉树 ...

  7. SQL Server插入中文乱码

    如果数据库的Collocation是英文的,字段是varchar类型,向表中插入中文数据,会出现乱码. 解决方法: 方法1. 修改varchar 为 nvarchar类型, 并在插入数据前加N,例如: ...

  8. PAT刷题记录

    1. 1007 素数对猜想 :运行超时 算法问题还是语言本身效率低下? import math def is_prime(num): if num == 2: return num temp = in ...

  9. bzoj4650: [Noi2016]优秀的拆分 hash

    好气啊,没开longlong又biubiu了 底层: 用hash或者奇奇怪怪的算法兹磁logn求最长公共前后缀 思路: 统计出从一个点开始和结束的形如AA的子串的个数 统计的时候把相邻的结果相乘加起来 ...

  10. 寒假作业第二组C题题解

    这道题题意很简单,主要是练习map的使用.看输入有三个数据,水果名,地名,和出现次数.再看输出,很容易想到map<string,int> string是水果,int是次数,那个地名怎么用m ...