UVA-10537 The Toll! Revisited (dijkstra)
题目大意:每经过一个地方就要交出相应的货物作为过路费,问将一批货物从起点运到终点,最少需要携带多少货物?
题目分析:在每一站交的过路费由当前拥有的货物量来决定,所以,要以终点为源点,求一次单源最短路即可。注意,输出要求路径字典序最小。
代码如下:
# include<iostream>
# include<cstdio>
# include<queue>
# include<vector>
# include<cstring>
# include<algorithm>
using namespace std;
# define LL long long const LL INF=0x7fffffffffffffff;
struct Node
{
int u;
LL d;
Node(int _u,LL _d):u(_u),d(_d){}
bool operator < (const Node &a) const {
return d>a.d;
}
};
int vis[55],n,p,s,e,path[55];
LL dist[55];
vector<int>G[55]; LL get(LL d,int id)
{
if(id>25) return 1LL;
LL l=d,r=d/(19LL)*(20LL)+19,ans;
while(l<r){
LL m=l+(r-l)/2;
LL k=m-(m+(LL)19)/((LL)20);
if(k>=d){
r=m;
ans=r;
}else{
l=m+1;
ans=l;
}
}
return ans-d;
/*LL temp=d*20LL/19;
while(temp-(temp+19LL)/20LL<d) ++temp;
return temp-d;*/
} void dijkstra()
{
for(int i=0;i<52;++i) path[i]=i;
memset(vis,0,sizeof(vis));
priority_queue<Node>q;
fill(dist,dist+52,INF);
dist[e]=p;
q.push(Node(e,(LL)p));
while(!q.empty())
{
Node u=q.top();
q.pop();
if(vis[u.u]) continue;
vis[u.u]=1;
for(int i=0;i<G[u.u].size();++i){
int v=G[u.u][i];
LL w=get(u.d,u.u);
if(dist[v]>w+u.d){
dist[v]=w+u.d;
path[v]=u.u;
q.push(Node(v,dist[v]));
}else if(dist[v]==w+u.d&&path[v]>u.u){
path[v]=u.u;
q.push(Node(v,dist[v]));
}
}
}
} void print(int u)
{
char c;
if(u>25) c=u+'a'-26;
else c=u+'A';
if(path[u]==u){
if(u!=s)
printf("-");
printf("%c\n",c);
return ;
}
if(u==s){
printf("%c",c);
print(path[u]);
}else{
printf("-%c",c);
print(path[u]);
}
} int main()
{
int u,v,cas=0;
char a[2],b[2],S[2],E[2];
while(scanf("%d",&n)&&n!=-1)
{
for(int i=0;i<52;++i) G[i].clear();
for(int i=0;i<n;++i){
scanf("%s%s",a,b);
if(a[0]>='A'&&a[0]<='Z') u=a[0]-'A';
else u=a[0]-'a'+26;
if(b[0]>='A'&&b[0]<='Z') v=b[0]-'A';
else v=b[0]-'a'+26;
G[u].push_back(v);
G[v].push_back(u);
}
scanf("%d%s%s",&p,S,E);
if(S[0]>='A'&&S[0]<='Z') s=S[0]-'A';
else s=S[0]-'a'+26;
if(E[0]>='A'&&E[0]<='Z') e=E[0]-'A';
else e=E[0]-'a'+26; dijkstra(); printf("Case %d:\n",++cas);
printf("%lld\n",dist[s]);
print(s);
}
return 0;
}
UVA-10537 The Toll! Revisited (dijkstra)的更多相关文章
- UVA 10537 - The Toll! Revisited(dijstra扩张)
UVA 10537 - The Toll! Revisited option=com_onlinejudge&Itemid=8&page=show_problem&catego ...
- UVA 10537 The Toll! Revisited uva1027 Toll(最短路+数学坑)
前者之所以叫加强版,就是把uva1027改编了,附加上打印路径罢了. 03年的final题哦!!虽然是水题,但不是我这个只会做图论题的跛子能轻易尝试的——因为有个数学坑. 题意:运送x个货物从a-&g ...
- UVA 10537 The Toll! Revisited 过路费(最短路,经典变形)
题意:给一个无向图,要从起点s运送一批货物到达终点e,每个点代表城镇/乡村,经过城镇需要留下(num+19)/20的货物,而经过乡村只需要1货物即可.现在如果要让p货物到达e,那么从起点出发最少要准备 ...
- UVa 12661 - Funny Car Racing(Dijkstra)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 10537 The Toll! Revisited (最短路)
题意:给定一个图,你要从 s 到达 t,当经过大写字母时,要交 ceil(x /20)的税,如果经过小写字母,那么交 1的税,问你到达 t 后还剩下 c 的,那么最少要带多少,并输出一个解,如果多个解 ...
- 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)
迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...
- 最短路径之迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...
- 理解最短路径——迪杰斯特拉(dijkstra)算法
原址地址:http://ibupu.link/?id=29 1. 迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科 ...
- uva 1153 顾客是上帝(贪心)
uva 1153 顾客是上帝(贪心) 有n个工作,已知每个工作需要的时间q[i]和截止时间d[i](必须在此前完成),最多能完成多少个工作?工作只能串行完成,第一项任务开始的时间不早于时刻0. 这道题 ...
随机推荐
- jenkins SSH登录 Git配置(通过eclipse生成SSH 密钥)
1.通过eclipse生成SSH 密钥 菜单栏的windows-->preferences-->General-->Network Connections-->SSH2--&g ...
- vim中快速定位到某行以及快捷删除多行
vim filename 在命令行中直接输入 numberG 比如 100G直接定位到100行 输入 :set number即显示行号 : i,.d删除从第i行到目前所在行内容
- rabbitmq报错type
TypeError: exchange_declare() got an unexpected keyword argument 'type' 原因应该为pika版本不同导致的用法不同,解决方法为把t ...
- git 常用的撤销操作
git 开发时的使用流程,从同事那里学习的, 第一步,先建立一个新的分支,可以在GITLAB或通过命令git checkout -b newbranch 或通过IDE插件 第二步,让项目切换到该分支, ...
- 在Linux下不重启让配置文件修改后立即生效的办法
在linux修改配置文件后可能没有生效,比如JDK文件配置,配置后可能没有生效,为了让文件生效,如下操作可以让配置文件生效. 例如,我刚修改了“/etc/profile”或“~/.bash_profi ...
- 超级强大的vim配置(vimplus)--续集
An automatic configuration program for vim 安装(github地址:https://github.com/chxuan/vimplus.git, 欢迎star ...
- [转]总结一下CSS中的定位 Position 属性
在CSS中,Position 属性经常会用到,主要是绝对定位和相对定位,简单的使用都没有问题,尤其嵌套起来,就会有些混乱,今记录总结一下,防止久而忘之. CSS position 属性值: absol ...
- Spark高级数据分析· 6LSA
潜在语义分析 wget http://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-articles-multistream.xml.bz ...
- [Linux 001]——计算机和操作系统的基础知识
在正式开始学习 Linux 操作系统之前,有必要先回顾/学习一下计算机和操作系统的基本知识,为我们在后续的学习中铺路搭桥,在了解计算机一些基础原理的条件下再去进行学习,理解应该会更透彻一些.我会从一个 ...
- 20145331《Java程序设计》第1周学习总结
20145331<Java程序设计>第1周学习总结 教材学习内容总结 第一章 1.java的三大平台分别为java SE.java EE.java ME,其中java SE是基础. 2.j ...