题目大意:每经过一个地方就要交出相应的货物作为过路费,问将一批货物从起点运到终点,最少需要携带多少货物?

题目分析:在每一站交的过路费由当前拥有的货物量来决定,所以,要以终点为源点,求一次单源最短路即可。注意,输出要求路径字典序最小。

代码如下:

# 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)的更多相关文章

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

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

  2. UVA 10537 The Toll! Revisited uva1027 Toll(最短路+数学坑)

    前者之所以叫加强版,就是把uva1027改编了,附加上打印路径罢了. 03年的final题哦!!虽然是水题,但不是我这个只会做图论题的跛子能轻易尝试的——因为有个数学坑. 题意:运送x个货物从a-&g ...

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

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

  4. UVa 12661 - Funny Car Racing(Dijkstra)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

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

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

  6. 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)

    迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...

  7. 最短路径之迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...

  8. 理解最短路径——迪杰斯特拉(dijkstra)算法

    原址地址:http://ibupu.link/?id=29 1.       迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科 ...

  9. uva 1153 顾客是上帝(贪心)

    uva 1153 顾客是上帝(贪心) 有n个工作,已知每个工作需要的时间q[i]和截止时间d[i](必须在此前完成),最多能完成多少个工作?工作只能串行完成,第一项任务开始的时间不早于时刻0. 这道题 ...

随机推荐

  1. kettle中的karaf设置

    Spoon.sh设置-Dpentaho.karaf.root.copy.dest.folder=$PENTAHO_KARAF_ROOT -Dpentaho.karaf.root.transient=f ...

  2. golang在线手册汇总

    1. golang官网 https://golang.org/ 2. golang中国 http://www.golangtc.com/ http://godoc.golangtc.com/pkg/ ...

  3. MFC中存在的不属于任何类的全局函数,它们统统在函数名称开头加上Afx

    MFC中存在的不属于任何类的全局函数,它们统统在函数名称开头加上Afx. 函数名称 说明 AfxWinInit 被WinMain(MFC提供)调用的一个函数,用做MFC GUI程序初始化的一部分,如果 ...

  4. python 之操作mysql 数据库实例

    对于python操作mysql 数据库,具体的步骤应为: 1. 连接上mysql host 端口号 数据库 账号 密码2. 建立游标3. 执行sql(注意,如果是update,insert,delet ...

  5. Oracle中的substr()函数详解案例

    1)substr函数格式   (俗称:字符截取函数) 格式1: substr(string string, int a, int b); 格式2:substr(string string, int a ...

  6. Linux数据备份与恢复 dump、restore、dd命令

    dump命令:备份分区.文件或目录 在Linux系统中 dump 命令是没有安装的,所以先安装一下 dump 命令,安装命令如下: [root@localhost -]# yum -y install ...

  7. 编码解码--三种常见字符编码简介:ASCII、Unicode和UTF-8

    什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255( ...

  8. ionic android - Unable to start the daemon process. Could not reserve enough space for 2097152KB object heap

    Unzipping C:\Users\app\.gradle\wrapper\dists\gradle-4.1-all\bzyivzo6n839fup2jbap0tjew\gradle-4.1-all ...

  9. Elasticsearch+Kibana+Logstash安装

    安装环境: [root@node- src]# cat /etc/redhat-release CentOS Linux release (Core) 安装之前关闭防火墙 firewalld 和 se ...

  10. windows server 2012泛域名解析配置

    应测试要求,要将一个泛域名(*.office.baibai.com)解析到一个内网的IP(10.1.100.240)地址上(使用域控DNS解析)...以下为我的配置过程,做的时候将图顺便接了下来: 1 ...