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),好厉害。。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<queue> 5 #include<string> 6 #include<algorithm> 7 using namespace std; 8 #define INF (1<<29) 9 int n,G[222][222]; 10 int d[222][10001]; 11 bool vis[222][10001]; 12 struct Node{ 13 int u,mx; 14 Node(int _u,int _mx):u(_u),mx(_mx){} 15 }; 16 void SPFA(int vs){ 17 for(int i=0; i<n; ++i){ 18 for(int j=0; j<10001; ++j) d[i][j]=INF; 19 } 20 d[vs][0]=0; 21 memset(vis,0,sizeof(vis)); 22 vis[vs][0]=1; 23 queue<Node> que; 24 que.push(Node(vs,0)); 25 while(!que.empty()){ 26 Node nd=que.front(); que.pop(); 27 int u=nd.u,mx=nd.mx; 28 for(int v=0; v<n; ++v){ 29 if(G[u][v]==INF) continue; 30 if(G[u][v]>mx && d[v][G[u][v]]>d[u][mx]+mx){ 31 d[v][G[u][v]]=d[u][mx]+mx; 32 if(!vis[v][G[u][v]]){ 33 vis[v][G[u][v]]=1; 34 que.push(Node(v,G[u][v])); 35 } 36 } 37 if(d[v][mx]>d[u][mx]+G[u][v]){ 38 d[v][mx]=d[u][mx]+G[u][v]; 39 if(!vis[v][mx]){ 40 vis[v][mx]=1; 41 que.push(Node(v,mx)); 42 } 43 } 44 } 45 vis[u][mx]=0; 46 } 47 } 48 int main(){ 49 string name[222],x[111],y[111],vs,vt; 50 int m,z[111]; 51 while(cin>>vs>>vt){ 52 n=0; 53 scanf("%d",&m); 54 for(int i=0; i<m; ++i){ 55 cin>>x[i]>>y[i]>>z[i]; 56 name[n++]=x[i]; name[n++]=y[i]; 57 } 58 sort(name,name+n); 59 n=unique(name,name+n)-name; 60 for(int i=0; i<n; ++i){ 61 for(int j=0; j<n; ++j) G[i][j]=INF; 62 } 63 for(int i=0; i<m; ++i){ 64 int u=lower_bound(name,name+n,x[i])-name,v=lower_bound(name,name+n,y[i])-name; 65 G[u][v]=z[i]; 66 } 67 SPFA(lower_bound(name,name+n,vs)-name); 68 int tv=lower_bound(name,name+n,vt)-name; 69 int res=INF; 70 for(int i=0; i<10001; ++i) res=min(res,d[tv][i]); 71 printf("%d\n",res); 72 } 73 return 0; 74 }
转载于:https://www.cnblogs.com/WABoss/p/5223179.html
ZOJ1027 Travelling Fee(DP+SPFA)相关推荐
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数)
CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数) 题目大意:这题目啊,贼难理解- 定义一个数列是"好的&quo ...
- 蓝桥杯备考-刷题之路-动态规划算法(DP算法)Part1
之前在刷力扣的时候就是浑浑噩噩的,照着评论区的答案写了一遍就万事大吉了,没有深度思考过.这次备考蓝桥杯看到DP算法的第一道题就不会,更难受的是看答案了依然完全不理解,所以决心把DP算法一次弄懂. 开始 ...
- Ivan the Fool and the Probability Theory-Codeforces Round #594 (Div. 2)-C题(dp+思维)
Ivan the Fool and the Probability Theory-Codeforces Round #594 (Div. 2)-C题(dp+思维) time limit per tes ...
- PAT天梯赛练习题——L3-005. 垃圾箱分布(暴力SPFA)
L3-005. 垃圾箱分布 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁 ...
- H - 拦截导弹 OpenJ_Bailian - 2945(dp动态规划)
某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭,并观 ...
- leetcode 1024. 视频拼接(dp/贪心)
你将会获得一系列视频片段,这些片段来自于一项持续时长为 T 秒的体育赛事.这些片段可能有所重叠,也可能长度不一. 视频片段 clips[i] 都用区间进行表示:开始于 clips[i][0] 并于 c ...
- LeetCode 161. 相隔为 1 的编辑距离(DP/遍历)
文章目录 1. 题目 2. 解题 2.1 DP超时 2.2 一次遍历 1. 题目 给定两个字符串 s 和 t,判断他们的编辑距离是否为 1. 注意: 满足编辑距离等于 1 有三种可能的情形: 往 s ...
- LeetCode 1293. 网格中的最短路径(DP/BFS)
1. 题目 给你一个 m * n 的网格,其中每个单元格不是 0(空)就是 1(障碍物). 每一步,您都可以在空白单元格中上.下.左.右移动. 如果您 最多 可以消除 k 个障碍物,请找出从左上角 ( ...
最新文章
- [转]通过脚本添加登陆/注销/开机/关机脚本
- 超声相控阵合成孔径成像FPGA设计介绍
- MySQL数据库基本的“增删改查”操作 -《狗嗨默示录》-
- 使用公式给参数赋默认初始值
- HTML基础(part3)--常用标签之HTML标签
- linux-0.11内核 调试教程+GCC源代码
- FaceBoxes的学习笔记
- php 参数类对象以及改变对象,php类和对象--重载
- 184.部门工资最高的员工
- JasperReport导出Excel锁定行或列
- ftp上传软件,五款ftp优秀的ftp上传软件
- 程序员为什么害怕低代码?
- android 添加 iconv 支持
- JAVA的使用idea导包
- 二维图像的傅立叶变换
- mmc0: error -84 whilst initialising SD card
- 第三篇:用SOUI能做什么?
- 高新技术企业认定有什么好处
- DPU智能网卡OVS全卸载方案
- TitleLabel