ZOJ1027 Travelling Fee(DP+SPFA)
给一张有向无环图,边都有花费,从某点到某点走的那条路径上的那一条花费最多的边可以省掉,问从起点到终点的最少花费的多少,
往DP想的话,就可以写出这个状态dp[u][mx],表示到达u点已经省掉的花费为mx的最少花费。
用SPFA更新转移方程。。或者理解成队列+我为人人的转移。。其实这题这样子也能解有环图。
看了别人博客,发现还有三种解法:
- 枚举每一条边作为省掉的边,n次SPFA。这方法简洁,可惜想不出= =
- 跑Dijkstra,根据记录到每一点时的最长边更新,正确性不懂。。
- Floyd+DP:加个维度,dpk[0\1][u][v],第一维1和0分别表示省和没省最长边的最少花费,dp[1]的转移就是dp[1][u][v]=min(dp[0][u][k]+dp[1][k][v],dp[1][u][k]+dp[0][k][v]),初始dp[1][i][j]=0(<i,j>∈E),好厉害。。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
#define INF (1<<29)
int n,G[][];
int d[][];
bool vis[][];
struct Node{
int u,mx;
Node(int _u,int _mx):u(_u),mx(_mx){}
};
void SPFA(int vs){
for(int i=; i<n; ++i){
for(int j=; j<; ++j) d[i][j]=INF;
}
d[vs][]=;
memset(vis,,sizeof(vis));
vis[vs][]=;
queue<Node> que;
que.push(Node(vs,));
while(!que.empty()){
Node nd=que.front(); que.pop();
int u=nd.u,mx=nd.mx;
for(int v=; v<n; ++v){
if(G[u][v]==INF) continue;
if(G[u][v]>mx && d[v][G[u][v]]>d[u][mx]+mx){
d[v][G[u][v]]=d[u][mx]+mx;
if(!vis[v][G[u][v]]){
vis[v][G[u][v]]=;
que.push(Node(v,G[u][v]));
}
}
if(d[v][mx]>d[u][mx]+G[u][v]){
d[v][mx]=d[u][mx]+G[u][v];
if(!vis[v][mx]){
vis[v][mx]=;
que.push(Node(v,mx));
}
}
}
vis[u][mx]=;
}
}
int main(){
string name[],x[],y[],vs,vt;
int m,z[];
while(cin>>vs>>vt){
n=;
scanf("%d",&m);
for(int i=; i<m; ++i){
cin>>x[i]>>y[i]>>z[i];
name[n++]=x[i]; name[n++]=y[i];
}
sort(name,name+n);
n=unique(name,name+n)-name;
for(int i=; i<n; ++i){
for(int j=; j<n; ++j) G[i][j]=INF;
}
for(int i=; i<m; ++i){
int u=lower_bound(name,name+n,x[i])-name,v=lower_bound(name,name+n,y[i])-name;
G[u][v]=z[i];
}
SPFA(lower_bound(name,name+n,vs)-name);
int tv=lower_bound(name,name+n,vt)-name;
int res=INF;
for(int i=; i<; ++i) res=min(res,d[tv][i]);
printf("%d\n",res);
}
return ;
}
ZOJ1027 Travelling Fee(DP+SPFA)的更多相关文章
- ZOJ1232 Adventure of Super Mario(DP+SPFA)
dp[u][t]表示从起点出发,到达i点且用了t次magic boot时的最短时间, 方程如下: dp[v][t]=min(dp[v][t],dp[u][t]+dis[u][v]); dp[v][t] ...
- [luoguP3953] 逛公园(DP + spfa)
传送门 看到求方案数,应该很容易想到dp f[u][i]表示到点u,且比到u的最短距离多i的方案数 那么需要先预处理dis数组,spfa或者堆优化的dijk 因为考虑到dp的顺序,f[u][i]转移到 ...
- [luoguP1772] [ZJOI2006]物流运输(DP + spfa)
传送门 预处理cost[i][j]表示从第i天到第j天起点到终点的最短距离 f[i]表示前i天到从起点到终点的最短距离 f[0] = -K f[i] = min(f[i], f[j - 1] + co ...
- bzoj1003: [ZJOI2006]物流运输(DP+spfa)
1003: [ZJOI2006]物流运输 题目:传送门 题解: 可以用spfa处理出第i天到第j都走这条路的花费,记录为cost f[i]表示前i天的最小花费:f[i]=min(f[i],f[j-1] ...
- 取数字(dp优化)
取数字(dp优化) 给定n个整数\(a_i\),你需要从中选取若干个数,使得它们的和是m的倍数.问有多少种方案.有多个询问,每次询问一个的m对应的答案. \(1\le n\le 200000,1\le ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- [Codeforces722E] Research Rover (dp+组合数学)
[Codeforces722E] Research Rover (dp+组合数学) 题面 给出一个N*M的方格阵,从(1,1)出发,到(N,M)结束,从(x,y)只能走到(x+1,y)或(x,y+1) ...
- 6101 最优贸易 (双向spfa)
描述C国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的 ...
- Rikka with Subset HDU - 6092 (DP+组合数)
As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some mat ...
随机推荐
- Lua2
1. 迭代器与Closure 在Lua中,迭代器通常为函数,每调用一次函数,即返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之间保持一些状态,这样才能知道它所在的位置和下一次遍历时的位置. ...
- python小结
c:\python33添加到你的PATH 环境变量中,你可以在DOS 窗口中 输入以下命令:set path=%path%;C:\python33 id() 方法的返回值就是对象的内存地址. 在#! ...
- ASP.NET Core ---异常处理
一.局部异常处理: 在Action里面catch 二.全局异常处理: 1.默认的异常处理配置: 默认配置在StartUp文件的Configure中注册错误处理,显示开发者错误页面: public vo ...
- 孤荷凌寒自学python第二十八天python的datetime.date模块
孤荷凌寒自学python第二十八天python的datetime.date模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.toordinal() 此方法将访问从公元1年1月1日至当 ...
- 孤荷凌寒自学python第十六天python的迭代对象
孤荷凌寒自学python第十六天python的迭代对象 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 迭代也就是循环. python中的迭代对象有相关的如下几个术语: A容器 contrai ...
- URAL 1942 Attack at the Orbit
B - Attack at the Orbit Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & % ...
- js 回车触发点击事件
$(document).keyup(function(event){ if(event.keyCode ==13){ $("#submit").trigger("clic ...
- h5滚动条加载到底部
https://www.zhihu.com/question/31861301 重复加载问题 http://www.jianshu.com/p/12aa901bee1f?from=timeline w ...
- Windows2008下RDP采用私有CA服务器证书搭建文档
在中小型公司建立企业根证书颁发机构 (CA) http://www.microsoft.com/china/smb/issues/sgc/articles/build_ent_root_ca.mspx ...
- 微信设置URL之WebApi方式
微信公众号开发者设置里的URL,现在采用WebAPI的方式,结果一直报“未能正确设置Token”的错误,采用Handler和MVC的方式倒是可以. 解决步骤一,添加服务器IP到白名单. 解决步骤二,确 ...