前者之所以叫加强版,就是把uva1027改编了,附加上打印路径罢了。

03年的final题哦!!虽然是水题,但不是我这个只会做图论题的跛子能轻易尝试的——因为有个数学坑。

题意:运送x个货物从a->b,沿途要上交过路费,village(小写字母)只需交一个单位的货物,town(大写字母)要交(x/20+((x%20==0)?0:1))个单位的货物,即每20个货物要上交一个,不足的按20处理。现在已知要送到b点y个货物,那么最少从x出发要携带多少个货物。

注意:

1、路过town:19=20-1,同时19=21-2,所以要求最小值。

2、用dijkstra做,不过是从 b->a ,路径u->v的权值为经过u点扣除的货物。

3、打印路径:反向。从a->b,沿着d[v]==d[u]-s走,必为最短路。(从b->a有多条最短路,但从a->b沿着这个条件走,只有一条最短路)

4、字典序最小:预处理,sort()后再建图。已知邻接表是模仿指针的头插法——后进先出。

5、数学坑= =:

  先举个例子,要送到town A 10000个货物,针对10000,要扣除500。那么是不是携带10500就能满足要求呢?不是的T^T,10500-525==9975。所加上的500,仍然会被扣除一些货物。(TLE的原因,本以为差的不多,就每次做++判断了)

  用递推直接求每部分要补充的货物,用大数据测发现差了1。这不是计算问题,而是存在错误的:沿用上一个例子,要送10000个货物,需扣除500个,500又需扣25个,那么25需不需要扣呢?扣的话又要扣2个,那么两个还要再扣一个么??关键是余数,两次扣除的余数均不为0,那么分开算要扣2个,然而两数之和不足20,只需扣1个。

  所以要直接求。

6、不要忘了long long,__int64 害我CE了一发

 #include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
#define LL long long
using namespace std; const int MAXN=;
const LL INF =1e12+; struct Edge{
int v,next;
Edge(){}
Edge(int _v,int _next):v(_v),next(_next){}
}edge[MAXN*MAXN]; struct N{
int l,r;
}a[MAXN*MAXN]; int cmp(N a,N b)
{
if(a.l==b.l)
return a.r>b.r;
return a.l<b.l;
} int head[MAXN],tol;
int vis[MAXN];
LL d[MAXN];
queue<int>q; void init()
{
tol=;
memset(head,-,sizeof(head));
} void add(int u,int v)
{
edge[tol]=Edge(v,head[u]);
head[u]=tol++;
} void dijkstra(int st,int c)
{
memset(vis,,sizeof(vis));
for(int i=;i<;i++)
if(i==st)d[i]=c;
else d[i]=INF;
for(int i=;i<;i++)
{
if(head[i]==-)
continue; int x;
LL m=INF;
for(int j=;j<;j++)
{
if(!vis[j]&&d[j]<m){
x=j;
m=d[x];
}
}
vis[x]=;
LL t=,p=d[x];
if(x<)
while((p+t)-(p+t)/-((p+t)%==?:)<d[x])
{
t+=d[x]-((p+t)-(p+t)/-((p+t)%==?:));
}
else
t=;
for(int j=head[x];j!=-;j=edge[j].next)
{
int v=edge[j].v; if(d[v]>d[x]+t){
d[v]=d[x]+t;
}
}
}
} void road(int st,int ed)
{
int u=st;
LL s;
while(u!=ed)
{
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].v;
if(v<)
s=d[u]/+((d[u]%==)?:);
else
s=;
if(d[v]==d[u]-s){
q.push(v);
u=v;
break;
}
}
}
while(!q.empty())
{
int v=q.front();q.pop();
if(v<)
printf("-%c",v+'A');
else
printf("-%c",v-+'a');
}
printf("\n");
} int num(char ch)
{
if('a'<=ch&&ch<='z')
return (+ch-'a');
else
return (ch-'A');
} int main()
{
int n,c,cnt=;
char str1[],str2[];
while(~scanf("%d",&n))
{
if(n==-)
return ;
init();
for(int i=;i<n;i++)
{
scanf("%s%s",str1,str2);
a[i].l=num(str1[]);
a[i].r=num(str2[]);
}
sort(a,a+n,cmp);
for(int i=;i<n;i++)
{
add(a[i].l,a[i].r);
add(a[i].r,a[i].l);
} scanf("%d%s%s",&c,str1,str2);
int x=num(str1[]);
int y=num(str2[]);
dijkstra(y,c); printf("Case %d:\n",cnt++);
printf("%lld\n",d[x]);
if(x<)
printf("%c",x+'A');
else
printf("%c",x-+'a');
road(x,y);
}
return ;
}
 a b
b c
a d
d c
a c A B
B C
C D
D E
E F
F G
G H
H I
I J
J K
K L
L M
M N
N O
O P
P Q
Q R
R S
S T
T U
U V
V W
W X
X Y
Y Z
Z a
a b
b c
c d
d e
e f
f g
g h
h i
i j
j k
k l
l m
m n
n o
o p
p q
q r
r s
s t
t u
u v
v w
w x
x y
y z
A z A b
A B
b c
B c
A c A b
A B
b c
B c
A c A D
D X
A b
b c
c X
A X -

input

 Case :

 a-b-c

 Case :

 A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z-a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z

 Case :

 A-B-c

 Case :

 A-b-c

 Case :

 A-b-c-X

output

唉,吐槽一下。谁调试不用数据,就不能共享一下?做图论整天挨卡,想找个数据都找不到,自己又造不出好数据,要不然昨天那道lca就不会枚举344组数据了。当然,偶也知道debug的能力是重中之重,但这是经验积累起来的,以我这种弱菜,去刷uva&LA这种连题解都找不到的题库,受老咔哒了。难怪队友都说我整天愁眉苦脸的= =

UVA 10537 The Toll! Revisited uva1027 Toll(最短路+数学坑)的更多相关文章

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

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

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

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

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

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

  4. UVA10537 Toll! Revisited

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

  5. UVA 816 -- Abbott's Revenge(BFS求最短路)

     UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉 ...

  6. 【Toll!Revisited(uva 10537)】

    题目来源:蓝皮书P331 ·这道题使得我们更加深刻的去理解Dijkstra!       在做惯了if(dis[u]+w<dis[v])的普通最短路后,这道选择路径方案不是简单的比大小的题横在了 ...

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

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

  8. The Toll! Revisited UVA - 10537(变形。。)

    给定图G=(V,E)G=(V,E),VV中有两类点,一类点(AA类)在进入时要缴纳1的费用,另一类点(BB类)在进入时要缴纳当前携带金额的1/20(不足20的部分按20算) 已知起点为SS,终点为TT ...

  9. 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= ...

随机推荐

  1. ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

    引子: 本项目在老电脑上用的是oracle10g,换新电脑装的是oracle11g,但运行项目本没有什么关系,本来说创建个用户,用PLSQL手工导入数据,再改几下配置文件即可跑起来--但实际启动中遇到 ...

  2. 剑指offer--面试题17

    题目:合并两个排序的单向链表 自己所写代码如下: ListNode* MergeSortedLists(ListNode* pHead1, ListNode* pHead2) { if(pHead1 ...

  3. pureftpd安装配置-pureftp参数详解(一)

    1. 下载 #cd /usr/local/src/ #wget ftp://ftp.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.30.tar.g ...

  4. 使用文本文件(.txt)进行数据存取的技巧总结(相当的经典)

    使用文本文件(.txt)进行数据存取的技巧总结(相当的经典) 使用文本文件(.txt)进行数据存取的技巧总结 由于本帖内容较多,部分转自他人的心得,因此,凡转贴的地方仅用“----转----”标注,原 ...

  5. ASP文件操作(FSO)详解

    实例一:写入文件 语法 object.CreateTextFile([要建立的文件],[如存在,是否替代]) <% Set fs =Server.CreateObject("Scrip ...

  6. sql2008安装时提示重启计算机失败解决方法

    安装sql 2008的时候,在检测安装环境中有一项是”重新启动计算机”显示的结果是“失败”.上网看了半天,找到了解决方案,虽然我没弄明白具体原因,但问题是解决了,解决方案如下: 一.Windows+R ...

  7. Kafka之Purgatory Redesign Proposal (翻译)

    Purgatory是Kafka server中处理请求时使用的一个重要的数据结构.正好研究ReplicaManager源码的时候发现了这篇文章,顺便翻译下.由于这个proposal里的很多东西需要看源 ...

  8. CentOS 6.4 搭建SVN服务器

    SVN作为新一代代码版本管理工具,有很多优点,管理方便,逻辑明确,安全性高,代码一致性高.SVN数据存储有两种方式,BDB(事务安全表类型)和FSFS(一种不需要数据库的存储系统),为了避免在服务器连 ...

  9. 使用tornado让你的请求异步非阻塞

    http://www.dongwm.com/archives/shi-yong-tornadorang-ni-de-qing-qiu-yi-bu-fei-zu-sai/?utm_source=tuic ...

  10. hadoop倒排索引

    1.前言 学习hadoop的童鞋,倒排索引这个算法还是挺重要的.这是以后展开工作的基础.首先,我们来认识下什么是倒拍索引: 倒排索引简单地就是:根据单词,返回它在哪个文件中出现过,而且频率是多少的结果 ...