UVA 10537 The Toll! Revisited 过路费(最短路,经典变形)
题意:给一个无向图,要从起点s运送一批货物到达终点e,每个点代表城镇/乡村,经过城镇需要留下(num+19)/20的货物,而经过乡村只需要1货物即可。现在如果要让p货物到达e,那么从起点出发最少要准备多少货物?输出答案和路径(多条路径则必须输出字典序最小的)。注:终点需要花费,而起点不需要。
思路:这最短路变形的不错。要逆推过来求最短路径,那么就从e出发到s的距离!只是p比较大,而且城镇还得推出前一站到底需要多少货物,既然直接计算那么麻烦,也可以一直p++直到能留下p为止就推出来了;而乡村就容易推了,只是+1。但是还有个字典序要解决,则在碰到dist[u]==dist[v]+距离的时候就比较一下字典序谁小就记谁。
有一点别忘了,这是在逆推!!所以你要用出发点去更新终点时,要以出发点的dist来比较字典序。无向边是要建两条有向的,防止重边。
#include <bits/stdc++.h>
#define LL long long
#define pii pair<int,int>
#define INF 0x7f7f7f7f
using namespace std;
const int N=;
int n, m, l, edge_cnt;
LL p;
vector<int> vect[N];
struct node
{
int from, to;
node(){};
node(int from,int to):from(from),to(to){};
}edge[]; void add_node(int from,int to)
{
edge[edge_cnt]=node(from, to);
vect[from].push_back(edge_cnt++);
} LL dist[N];
int path[N], vis[N];
LL dijkstra(int s,int e)
{
memset(path, , sizeof(path));
memset(vis, , sizeof(vis));
memset(dist, 0x7f, sizeof(dist)); priority_queue<pii,vector<pii>,greater<pii> > que;
que.push(make_pair(p,s));
dist[s]=p; while(!que.empty())
{
int x=que.top().second;que.pop();
if(vis[x]) continue;
vis[x]=; bool flag=isupper(x); //大写,花费多的
LL t=dist[x]+(dist[x]+)/;
while(t-(t+)/<dist[x]) t++; //注意不要超时 for(int i=; i<vect[x].size(); i++)
{
node e=edge[vect[x][i]];
if( flag )
{
if(dist[e.to]>=t)
{
if(dist[e.to]==t)
{
if( x<edge[path[e.to]].from ) path[e.to]=vect[x][i]; //字典序
}
else path[e.to]=vect[x][i]; dist[e.to]=t;
que.push(make_pair(dist[e.to],e.to));
}
}
else
{
if(dist[e.to]>=dist[x]+)
{
if(dist[e.to]==dist[x]+)
{
if( x<edge[path[e.to]].from ) path[e.to]=vect[x][i]; //字典序
}
else path[e.to]=vect[x][i]; dist[e.to]=dist[x]+;
que.push(make_pair(dist[e.to],e.to));
}
}
}
}
return dist[e];
} void cal(int s,int e)
{
cout<<dijkstra(s,e)<<endl;
vector<char> ans;
int ed=e;
while(ed!=s)
{
ans.push_back( ed );
int t=path[ed];
ed=edge[t].from;
}
ans.push_back(s);
printf("%c",ans[]);
for(int i=; i<ans.size(); i++) printf("-%c",ans[i]);
cout<<endl;
} int main()
{
freopen("input.txt", "r", stdin);
char a, b;
int j=;
while(scanf("%d", &n), n>=)
{
edge_cnt=;
memset(edge,,sizeof(edge));
for(int i=; i<N; i++) vect[i].clear();
int up=;
for(int i=; i<n; i++)
{
getchar();
scanf("%c %c",&a,&b); //%c会接收到换行!!
add_node(a, b);
add_node(b, a);
}
scanf("%lld %c %c",&p, &a, &b);
printf("Case %d:\n",++j);
cal(b, a);
}
return ;
}
AC代码
UVA 10537 The Toll! Revisited 过路费(最短路,经典变形)的更多相关文章
- 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 到达 t,当经过大写字母时,要交 ceil(x /20)的税,如果经过小写字母,那么交 1的税,问你到达 t 后还剩下 c 的,那么最少要带多少,并输出一个解,如果多个解 ...
- uva 10537 Toll! Revisited(优先队列优化dijstra及变形)
Toll! Revisited 大致题意:有两种节点,一种是大写字母,一种是小写字母. 首先输入m条边.当经过小写字母时须要付一单位的过路费.当经过大写字母时,要付当前財务的1/20做过路费. 问在起 ...
- UVA10537 Toll! Revisited
difkstra + 路径输出 The Toll! Revisited Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...
- 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= ...
- 【Toll!Revisited(uva 10537)】
题目来源:蓝皮书P331 ·这道题使得我们更加深刻的去理解Dijkstra! 在做惯了if(dis[u]+w<dis[v])的普通最短路后,这道选择路径方案不是简单的比大小的题横在了 ...
- The Toll! Revisited UVA - 10537(变形。。)
给定图G=(V,E)G=(V,E),VV中有两类点,一类点(AA类)在进入时要缴纳1的费用,另一类点(BB类)在进入时要缴纳当前携带金额的1/20(不足20的部分按20算) 已知起点为SS,终点为TT ...
- Uva 10537 过路费
题目链接:http://vjudge.net/contest/143062#problem/C 题意: 给定一个无向图,大写字母是城市,小写字母是村庄,经过城市交过路费为当前货物的%5,路过村庄固定交 ...
随机推荐
- 移动端material风格日期时间选择器
原文 好多时候在移动端需要一个的日期选择器,由于在应用上有可能应用各种框架库(Vue.js, React.js, zepto.js等):所以说一个无依赖的,这样易于上层进行封装.直接开门见山,先来张动 ...
- 输入一个链表,输出该链表中倒数第k个结点。
// test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 【BZOJ】【3196】Tyvj 1730 二逼平衡树
树套树 Orz zyf 学(co)习(py)了一下树套树的写法,嗯……就是线段树套平衡树. 具体实现思路就是:外部查询用的都是线段树,查询内部自己调用平衡树的操作. 抄抄代码有助理解= = 八中挂了… ...
- C#中两个日期类型相减得到天数
protected int GetDuration(DateTime start, DateTime finish) { return (finish - start).Days; } 直接相减得到的 ...
- iOS开发网络编程之断点续传-NSURLConnection
最近在做一个小项目的时候,发现使用NSURLSession或者AFNNetworking进行断点续传时诸多的不便,于是自己封装了一个类来实现断点续传,在程序重新启动时仍然可以继续下载(需自己调用方法) ...
- 01-08-03【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider之缓存管理
http://www.cnblogs.com/lyj/archive/2008/11/28/1343418.html 管理NHibernate二级缓存 NHibernate二级缓存由ISessionF ...
- hdu 4888
网络流建模,建模不难,难在找环: #include<cstdio> #include<algorithm> #include<vector> #include< ...
- Unity3D WP8发布解决方案名 DefaultPackageName 修改问题
原地址:http://blog.csdn.net/w337198302/article/details/16960661 在对Unity3D游戏进行Windows phone 8 发布的时候,首先是需 ...
- BS架构与CS架构的区别
C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势. ...
- Java学习笔记之:Java 继承
一.引言 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类.继承可以理解为一个对象从另一个对象获取属性的过程. 如果类A是类B的父类,而类B是类C的父类,我们也称C是A的子类,类 ...