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. 这道题 ...
随机推荐
- What does Quick Sort look like in Python?
Let's talk about something funny at first. Have you ever implemented the Quick Sort algorithm all by ...
- ios开发中怎么获取应用崩溃日志
如何获得crash日志 当一个iOS应用程序崩溃时,系统会创建一份crash日志保存在设备上.crash日志记录着应用程序崩溃信息,通常包含着每个执行线程的栈调用信息(低内存闪退日志例外),对于开发人 ...
- 微信小程序组件slider
表单组件slider:官方文档 Demo Code: var pageData = {} for (var i = 1; i < 5; i++) { (function (index) { pa ...
- PKU 1201 Intervals(差分约束系统+Spfa)
题目大意:原题链接 构造一个集合,这个集合内的数字满足所给的n个条件,每个条件都是指在区间[a,b]内至少有c个数在集合内.问集合最少包含多少个点.即求至少有多少个元素在区间[a,b]内. 解题思路: ...
- JVM内存—堆(heap)栈(stack)方法区(method) (转)
JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令 ...
- 189. Rotate Array(两次反转)
DescriptionHintsSubmissionsDiscussSolution Pick One Rotate an array of n elements to the right by ...
- windows 常用cmd命令
为了减少使用鼠标的频次,熟记一些常用应用的快捷键与系统本身常用的命令是必须的,以下记录一些常用的windows系统命令. 查看网络端口占用情况 :netstat -ano | findstr 8080 ...
- 异常信息 Exception
void GetExceptionMsg(Exception ex, StringBuilder sb, string Prefix = "") { sb.AppendLine(P ...
- Atom插件无法下载安装解决办法,Atom使用教程,Atom常用插件
使用教程http://wiki.jikexueyuan.com/project/atom/plug-in.html atom通过setting中无法下载插件,通过apm也无法下载插件,可能是网络.co ...
- Camera帧率和AE的关系
1.camera首先是通过曝光的pixel加上dummy pixel以及曝光的line加上dummy line来决定一帧的曝光时间,这一帧曝光时间的倒数就是帧率,这个没有错吧,但是看代码时候看到pre ...