给一张有向无环图,边都有花费,从某点到某点走的那条路径上的那一条花费最多的边可以省掉,问从起点到终点的最少花费的多少,

往DP想的话,就可以写出这个状态dp[u][mx],表示到达u点已经省掉的花费为mx的最少花费。

用SPFA更新转移方程。。或者理解成队列+我为人人的转移。。其实这题这样子也能解有环图。

看了别人博客,发现还有三种解法:

  1. 枚举每一条边作为省掉的边,n次SPFA。这方法简洁,可惜想不出= =
  2. 跑Dijkstra,根据记录到每一点时的最长边更新,正确性不懂。。
  3. 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)相关推荐

  1. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  2. CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数)

    CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数) 题目大意:这题目啊,贼难理解- 定义一个数列是"好的&quo ...

  3. 蓝桥杯备考-刷题之路-动态规划算法(DP算法)Part1

    之前在刷力扣的时候就是浑浑噩噩的,照着评论区的答案写了一遍就万事大吉了,没有深度思考过.这次备考蓝桥杯看到DP算法的第一道题就不会,更难受的是看答案了依然完全不理解,所以决心把DP算法一次弄懂. 开始 ...

  4. 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 ...

  5. PAT天梯赛练习题——L3-005. 垃圾箱分布(暴力SPFA)

    L3-005. 垃圾箱分布 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁 ...

  6. H - 拦截导弹 OpenJ_Bailian - 2945(dp动态规划)

    某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭,并观 ...

  7. leetcode 1024. 视频拼接(dp/贪心)

    你将会获得一系列视频片段,这些片段来自于一项持续时长为 T 秒的体育赛事.这些片段可能有所重叠,也可能长度不一. 视频片段 clips[i] 都用区间进行表示:开始于 clips[i][0] 并于 c ...

  8. LeetCode 161. 相隔为 1 的编辑距离(DP/遍历)

    文章目录 1. 题目 2. 解题 2.1 DP超时 2.2 一次遍历 1. 题目 给定两个字符串 s 和 t,判断他们的编辑距离是否为 1. 注意: 满足编辑距离等于 1 有三种可能的情形: 往 s ...

  9. LeetCode 1293. 网格中的最短路径(DP/BFS)

    1. 题目 给你一个 m * n 的网格,其中每个单元格不是 0(空)就是 1(障碍物). 每一步,您都可以在空白单元格中上.下.左.右移动. 如果您 最多 可以消除 k 个障碍物,请找出从左上角 ( ...

最新文章

  1. [转]通过脚本添加登陆/注销/开机/关机脚本
  2. 超声相控阵合成孔径成像FPGA设计介绍
  3. MySQL数据库基本的“增删改查”操作 -《狗嗨默示录》-
  4. 使用公式给参数赋默认初始值
  5. HTML基础(part3)--常用标签之HTML标签
  6. linux-0.11内核 调试教程+GCC源代码
  7. FaceBoxes的学习笔记
  8. php 参数类对象以及改变对象,php类和对象--重载
  9. 184.部门工资最高的员工
  10. JasperReport导出Excel锁定行或列
  11. ftp上传软件,五款ftp优秀的ftp上传软件
  12. 程序员为什么害怕低代码?
  13. android 添加 iconv 支持
  14. JAVA的使用idea导包
  15. 二维图像的傅立叶变换
  16. mmc0: error -84 whilst initialising SD card
  17. 第三篇:用SOUI能做什么?
  18. 高新技术企业认定有什么好处
  19. DPU智能网卡OVS全卸载方案
  20. TitleLabel

热门文章

  1. stm32f4之GPIO
  2. CTFshow 命令执行 web121
  3. Java连接数据库(2)
  4. sklearn学习(一)
  5. 栈的逆转(递归实现)
  6. 第二讲 ODE欧拉数值方法
  7. Python实现微信消息防撤回
  8. Jquery获取参数(解决参数中文乱码问题)
  9. Python学习笔记-2017.5.4thon学习笔记-2017.8.14
  10. [hdu4333]Revolving Digits