这题其实想法挺简单的,因为他只需要简单的把每个点的花费和流量用dp记下来就好了

1.怎么记:

首先考虑dp的状态。由于所在的点和流量都要记,所以dp开二维,一维记所在的点,另一维记去哪

//dp[i][j] ==> i 是现在所在的点,j是流量

2.从哪开始

看题

3.转移方法

//dp[要去的点][现在的流量和要去的流量的最小值] = dp[现在的点][现在的流量]+去的花费

4.输出

在终点,对于每个能到达的流量,最大值就是花费/流量

dijkstra代码:

#include <iostream>
#include <algorithm>
#include <math.h>
#include <cstring>
#include <queue>
#include <fstream> using namespace std;
#define pp pair<long long,long long>
#define mp make_pair
long long maxi = 0, n,m, tot=0,head[100001];
struct Edge{
long long to, next,cost,flow;
}edge[100001];
void add(long long x, long long y,long long co, long long fl){
edge[tot].to = y;
edge[tot].cost = co;
edge[tot].flow = fl;
edge[tot].next = head[x];
head[x] = tot;
}
long long dp[1001][1001];
void dij(long long a, long long b){ // dijkstra
dp[a][b] = 0;
queue<pp> q;
q.push(mp(a,b));
while(!q.empty()){
long long qf = q.front().first;
long long qs = q.front().second;
q.pop();
for(long long i=head[qf];i;i=edge[i].next){
long long t = edge[i].to, flo = edge[i].flow;
if (dp[t][min(qs,flo)]>dp[qf][qs]+edge[i].cost){
dp[t][min(qs,flo)] = dp[qf][qs]+edge[i].cost; //上面讲的转移
q.push(mp(t,min(qs,flo)));
}
}
}
}
int main(){
// setIO("pump");
cin >> n >> m;
for (long long i=0;i<m;i++){
long long a,b,c,d; cin >> a >> b >> c >> d; add(a,a,c,d); add(b,b,c,d);
}
memset(dp,0x3f3f3f3f,sizeof(dp));
dij(1,1000);
for (long long i=1;i<1000;i++){
if (dp[n][i]>1e9) continue; //越界不?
long long num = floor((double)(i*1e6)/(double)dp[n][i]); // 不越界计算
maxi = max(maxi,num);
}
cout << maxi;
}

spfa:

#include <iostream>
#include <algorithm>
#include <math.h>
#include <cstring>
#include <queue>
#include <fstream> using namespace std;
#define pp pair<long long,long long>
#define mp make_pair
long long maxi = 0, n,m, tot=0,head[100001];
struct Edge{
long long to, next,cost,flow;
}edge[100001];
void add(long long x, long long y,long long co, long long fl){
edge[tot].to = y;
edge[tot].cost = co;
edge[tot].flow = fl;
edge[tot].next = head[x];
head[x] = tot;
}
bool vis[1001][1001];
long long dp[1001][1001];
void spfa(long long a, long long b){
dp[a][b] = 0;
vis[a][b] = true;
queue<pp> q;
q.push(mp(a,b));
while(!q.empty()){
long long qf = q.front().first;
long long qs = q.front().second;
vis[qf][qs] = false;
q.pop();
for(long long i=head[qf];i;i=edge[i].next){
long long t = edge[i].to, flo = edge[i].flow;
if (dp[t][min(qs,flo)]>dp[qf][qs]+edge[i].cost){
dp[t][min(qs,flo)] = dp[qf][qs]+edge[i].cost;
if (!vis[t][min(qs,flo)]) {vis[t][min(qs,flo)] = true;q.push(mp(t,min(qs,flo)));}
}
}
}
}
int main(){
// setIO("pump");
cin >> n >> m;
for (long long i=0;i<m;i++){
long long a,b,c,d; cin >> a >> b >> c >> d; add(a,a,c,d); add(b,b,c,d);
}
memset(dp,0x3f3f3f3f,sizeof(dp));
spfa(1,1000);
for (long long i=1;i<1000;i++){
if (dp[n][i]>1e9) continue;
long long num = floor((double)(i*1e6)/(double)dp[n][i]);
maxi = max(maxi,num);
}
cout << maxi;
}

最新文章

  1. jQuery UI resizable使用注意事项、实时等比例拉伸及你不知道的技巧
  2. Baseadapter与Simpleadapter之争
  3. 转:45 个 LoadRunner 面试问题(附答案)_纯英文,太有逼格了
  4. 在Sharepoint2010中一种自定义调查列表的不允许再次答复提示的处理方法!
  5. 2014年小结之sql语句优化
  6. java: org.luaj.vm2.LuaError:XXX module not found lua脚本初始化出错
  7. xdebug初步
  8. C#反射 获取程序集信息和通过类名创建类实例(转载)
  9. Laravel5.5 的 Homestead 开发环境部署
  10. 传输控制协议(TCP) -- TCP状态转换图
  11. mysql5.7.X版本only_full_group_by问题解决
  12. Python学习day9 函数Ⅰ(基础)
  13. golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题
  14. bootstrap treeview实现菜单树
  15. vue 关于父组件无法触发子组件的事件的解决方法
  16. 三.mysql表的完整性约束
  17. 第五章 绘图基础(LINEDEMO)
  18. 匹克定理pick
  19. windows7系统下升级到IE11时无法使用F12开发人员工具的解决办法
  20. Mysql-xtrabackup 与MySQL5.7 binlog 实现数据即时点恢复

热门文章

  1. C# 并行线程调用
  2. JAVAEE 和项目开发(第三课:HTTP的请求头和请求方式)
  3. RecyclerView+FloatingActionButton应用
  4. c# 用户控件,usercontrol,自定义控件属性
  5. Day 8:方法上自定义泛型、类上、接口上、泛型的上下限
  6. 获取网站IP地址(Linux,C)
  7. IDEA--IDEA配置web项目
  8. 洛谷 P1964 【mc生存】卖东西(多重背包)
  9. 18 11 24 简单的http服务器
  10. Java多线程之并发包,并发队列