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=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 (逆推,最短路)的更多相关文章
- uva 10537 Toll! Revisited(优先队列优化dijstra及变形)
Toll! Revisited 大致题意:有两种节点,一种是大写字母,一种是小写字母. 首先输入m条边.当经过小写字母时须要付一单位的过路费.当经过大写字母时,要付当前財务的1/20做过路费. 问在起 ...
- UVA 10537 The Toll! Revisited 过路费(最短路,经典变形)
题意:给一个无向图,要从起点s运送一批货物到达终点e,每个点代表城镇/乡村,经过城镇需要留下(num+19)/20的货物,而经过乡村只需要1货物即可.现在如果要让p货物到达e,那么从起点出发最少要准备 ...
- 【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 题意: 有两种节 ...
- UVa 10537 The Toll! Revisited (最短路)
题意:给定一个图,你要从 s 到达 t,当经过大写字母时,要交 ceil(x /20)的税,如果经过小写字母,那么交 1的税,问你到达 t 后还剩下 c 的,那么最少要带多少,并输出一个解,如果多个解 ...
- UVA 10537 - The Toll! Revisited(dijstra扩张)
UVA 10537 - The Toll! Revisited option=com_onlinejudge&Itemid=8&page=show_problem&catego ...
- Uva 10537 过路费
题目链接:http://vjudge.net/contest/143062#problem/C 题意: 给定一个无向图,大写字母是城市,小写字母是村庄,经过城市交过路费为当前货物的%5,路过村庄固定交 ...
- uva10537 dijkstra + 逆推
21:49:45 2015-03-09 传送 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8& ...
- UVA116Unidirectional TSP(DP+逆推)
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18206 题意:M*N的数阵,从左边一列到右边一列走过的数的和的最小.并输出路 ...
- UVA10537 Toll! Revisited
difkstra + 路径输出 The Toll! Revisited Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...
随机推荐
- linux c实现的提取文件名的小程序
/*@author etangyushan *工作中很多时候会和文件名打交道,有时候只需要文件名称,就写了这么一个小程序 *这个函数实现了把一个文件的绝对路径和后缀去除,只留下文件名的功能 * */ ...
- ubuntu 下交叉编译环境的搭建
1. 安装标准的C开发环境,由于Linux安装默认是不安装的,所以需要先安装一下(如果已经安装好的话,就可以免去这一步了): #sudo apt-get install gcc g++ libgcc1 ...
- Gym - 100851A Adjustment Office(O(1)求行列和)
Adjustment Office Gym - 100851A 2 3 4 3 4 5 4 5 6 n<=10^6,q&l ...
- Keras实现MNIST分类
仅仅为了学习Keras的使用,使用一个四层的全连接网络对MNIST数据集进行分类,网络模型各层结点数为:784: 256: 128 : 10: 使用整体数据集的75%作为训练集,25%作为测试 ...
- poj3191(进制转换)
题目链接:http://poj.org/problem?id=3191 题意:将一个数转换为-2为基数的数 思路:套路,看代码就好了 代码: #include <iostream> usi ...
- codeforces986F Oppa Funcan Style Remastered【线性筛+最短路】
容易看出是用质因数凑n 首先01个因数的情况可以特判,2个的情况就是ap1+bp2=n,b=n/p2(mod p1),这里的b是最小的特解,求出来看bp2<=n则有解,否则无解 然后剩下的情况最 ...
- Tyvj P1520 树的直径
P1520 树的直径 http://www.tyvj.cn/p/1520 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 树的直径,即这棵树中距离最远的两个结 ...
- 搭建Windows IIS(Internet Information Server)服务器
1.找到 控制面板\程序 点击 “打开或关闭Windows功能” ,全部选上“Internet信息服务”,这里可能要等几分钟. 2.完成之后你打开C盘,在他的根目录下多出一个inetpub文件夹里面有 ...
- 不使用三方包时,如何在ThinkSNS中建立优雅的用户权限管理
什么是ThinkSNS ? ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案,目前最新版本为ThinkSNS+(简称TS+).Thin ...
- The database could not be exclusively locked to perform the operation(SQL Server 5030错误解决办法)(转)
Microsoft SQL Server 5030错误解决办法 今天在使用SQL Server时,由于之前创建数据库忘记了设置Collocation,数据库中插入中文字符都是乱码,于是到DataBas ...