送外卖2

图论,动态规划,BFS,弗洛里德算法

感悟
1.dfs是个好东西,但是要优化喔
2.弗洛里德算法(简单的图,简单粗暴点直接三重for循环)
3.动态规划中的(一个数存取一长串二进制数,)二进制,
对二进制的移位,存取有了新的认识。
dp 拿以前的得到的结果,影响现在或者以后的结果。
4.思考用bfs的想法,实现实际是dfs.

bfs void(){ rep(i,1,q){
fla =1 bfs() fla()0;
}
rep(i,1,q){
w[i]=1; flg[i]=0; bfs; w[i]=0; flg[i]=1;
} }

多理解理解。
ps: 2号代码(用的是动态规划和二进制,想法很新颖)下次一定(doge);

牛客网:送外卖2 题意
n个点,m条有向边,q个外卖点。
q个外卖点信息 卖家位置,顾客位置,卖家做好的时间,顾客要求的时间送达
不管时间,问能送达的最大的外卖的点数。

1-------------------代码如下:
使用BFS解决
2020.11.11 优化后的代码
由割点(tarja算法)的启发,对dfs有了深刻的见解。
自己写的,害,dfs太爱了
下面为别人代码。

#include<iostream>
#include<cstring>
using namespace std;
int read(){int s = 0, f = 1; char ch = getchar();while(!isdigit(ch)){if(ch == '-') f = -1;ch = getchar();}while(isdigit(ch)) s = (s << 3) + (s << 1) + (ch ^ 48), ch = getchar();return s * f;
}int n,m,q;
int a[100][100]; //i-j value
//int flo[100][100]; // i-j minvalue
int flg[100];   //取与未取
int w[100];   //完成与未完成
int sum;
struct zw {int u,v,t1,t2;
}d[100];
void bfs(int t,int num,int s){   //时间,完成送达数,当前状态的起点//for(int i=0;i<q;i++) cout<<flg[i]<<" ";//cout<<endl;sum=max(num,sum);//第一个for循环  完成快递员取到一些外卖 //三个主要步骤fla[i]=1 bfs fla[i]=0. 时间复杂度嘛q<=10,算友好//而且先后顺序也安排好了,如:可送第 1,3,4配送需求,位置变换(3,1,4...)也可以实现。// 如果i=1了,含第0号配送需求且第1个完成的可能性全都考虑完了。这就是这个for循环的含义.for(int i=0;i<q;i++){if(flg[i]||w[i])   continue;//int ts=max(t+a[s][d[i].u],d[i].t1);flg[i]=1;//目的:缩短时间.有些配送需求明显超时或到达不了,不执行bfs,缩短时间.int r=d[i].t2;for(int j=0;j<q;j++){if(d[j].t2<r&&flg[j]==1){r=d[j].t2;} }   if(ts<=r)bfs(ts,num,d[i].u);flg[i]=0;//flg[] 很多状态 一旦变了状态(由flg,w数组,确定状态)就是下一个状态,那么BFS //BFS后 回到原来状态}//第二个循环  完成快递员将外卖送到用户手中. 思想同上一个for循环.//两个分立又关联的for循环,怎么完成任务呢:送第 1,3,4配送需求,一种情况两个for循环先后执行.for(int i=0;i<q;i++){if(w[i]||!flg[i]) continue;if(t+a[s][d[i].v]<=d[i].t2){w[i]=1;flg[i]=0;bfs(t+a[s][d[i].v],num+1,d[i].v);w[i]=0;flg[i]=1;}}return ;
}
int main (){cin>>n>>m>>q;int u,v,value;memset(a,10000,sizeof(a));for(int i=1;i<=100;i++) a[i][i]=0;for(int i=1;i<=m;i++){u=read();v=read(); value=read();a[u][v]=min(value,a[u][v]);}cout<<a[1][4]<<"  "<<a[3][1]<<endl<<endl;//flyodfor(int i=1;i<=n;i++){for(int j=1;j<=n;j++){for(int k=1;k<=n;k++){if(a[j][k]>a[j][i]+a[i][k])a[j][k]=a[j][i]+a[i][k];}}}//cout<<a[1][4]<<endl;for(int i=0;i<q;i++){d[i].u=read();d[i].v=read();d[i].t1=read();d[i].t2=read();}bfs(0,0,1);cout<<sum<<endl;
}

2--------------------代码如下:
使用动态规划解决:

#include<iostream>
#include<cstring>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
const int INF=0x3f3f3f3f;
int n,m,q;
int three[20]; //value:3的i次方
int dp[60000][30]; //当前完成的任务, 快递员当前所在点。
int digit[60000][30]; //所有的可能, 每种可能对应的三进制。
int a[410][410];
struct s_node{int from,to,l,r;
}b[600];
void floyd(){rep(i,1,n)rep(j,1,n)rep(k,1,n){a[j][k] = min(a[j][k],a[j][i]+a[i][k]);}return ;
}
void zw(){three[0] =1;for(int i=1;i<=10;i++)three[i] = three[i-1]*3;for(int i=0;i<three[10];i++){int ans=i;for(int j=0;j<10;j++){digit[i][j]=ans%3;ans/=3;}}rep(i,0,60000-1)rep(j,0,20)dp[i][j]=INF;rep(i,1,20){rep(j,1,20){if(i==j) a[i][j]=0;else a[i][j]=INF;}}return ;
}
int main (){//cout<<0x3f;cin>>n>>m>>q;zw();int x,y,value;for(int i=1;i<=m;i++){cin>>x>>y>>value;a[x][y]=min(value,a[x][y]);}floyd();rep(i,0,q-1){cin>>b[i].from>>b[i].to>>b[i].l>>b[i].r;}int qs=1;rep(i,1,q) qs*=3;dp[0][1]=0;rep(i,0,qs-1){// 所有的点都试一遍rep(j,1,n){if(dp[i][j]<INF){rep(k,0,q-1){if(digit[i][k]==0){int next=i+three[k];int temp;temp=max(b[k].l,dp[i][j]+a[j][b[k].from]);dp[next][b[k].from]=min(dp[next][b[k].from],temp);}else if(digit[i][k]==1){int next=i+three[k];if(dp[i][j]+a[j][b[k].to]<=b[k].r){dp[next][b[k].to] = min(dp[next][b[k].to],dp[i][j]+a[j][b[k].to]);}}else continue;}}}}int ans=0;rep(i,0,qs-1){rep(j,1,n){if(dp[i][j]<INF){int num =0;//cout<<i<<endl;for(int k=0;k<q;k++){if(digit[i][k]==2) num++;}ans=max(ans,num);}}}cout<<ans<<endl;return 0;
}

题—送外卖2(最短路径dfs)相关推荐

  1. 2021第六届数维杯大学生数学建模竞赛赛题_A 外卖骑手的送餐危机

    外卖骑手的送餐危机 外卖业务已经成为了大城市上班族每日生活中不可或缺的一部分.根据美团2020年6月发布的<2019中国即时配送行业发展报告>中显示,2019年我国即食配送业务订单规模达到 ...

  2. PTA L2-043龙龙送外卖

    4.1.6 L2-043龙龙送外卖 题目地址:https://pintia.cn/problem-sets/994805046380707840/exam/problems/1518582482059 ...

  3. PTA L2-043 龙龙送外卖

    龙龙送外卖 龙龙是"饱了呀"外卖软件的注册骑手,负责送帕特小区的外卖.帕特小区的构造非常特别,都是双向道路且没有构成环 -- 你可以简单地认为小区的路构成了一棵树,根结点是外卖站, ...

  4. 谁说程序员过了35岁之后就要去“送外卖”、“跑滴滴”?这几种发展走向照样解除焦虑

    前段时间在技术交流群里聊天,无意间说到了程序员35岁之后的未来规划,说到未来,大多数人都是"跑滴滴"."送外卖",虽是玩笑话,但的确是很迷茫. 说到程序员,在外 ...

  5. LibreOJ #6177. 「美团 CodeM 初赛 Round B」送外卖2【状压DP】

    「美团 CodeM 初赛 Round B」送外卖2 内存限制:32 MiB 时间限制:200 ms 题目描述 一 张 n 个 点 m 条 有 向 边 的 图 上 , 有 q 个 配 送 需 求 , 需 ...

  6. 知乎热议:浙大读博八年现靠送外卖赚钱

    点击上方"码农突围",马上关注 这里是码农充电第一站,回复"666",获取一份专属大礼包 真爱,请设置"星标"或点个"在看&quo ...

  7. 美团面试都面不过?我又不是去送外卖的!美团Java面试经历总结【一面、二面、三面】

    美团面试都面不过?我又不是去送外卖的!美团Java面试经历总结[一面.二面.三面]这篇文章主要介绍了美团Java面试经历,总结分析了美团java三轮面试中所遇到的各种问题,对于参与java面试有一定参 ...

  8. HNUSTOJ-1698 送外卖(TSP问题 + 状态压缩DP)

    1698: 送外卖 时间限制: 1 Sec  内存限制: 128 MB 提交: 123  解决: 28 [ 提交][ 状态][ 讨论版] 题目描述 在美团和饿了么大行其道的今天,囊中羞涩的小周和小美, ...

  9. 浙大读博八年现靠送外卖赚钱,本人:进组以来博士无一人按时毕业

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 杨净 发自 凹非寺 量子位 | 公众号 QbitAI 浙大在读博士, ...

最新文章

  1. 还不错的Table样式和form表单样式
  2. JS获取div滚动条距离实现弹出标签位置动态移动
  3. 【小白学习C++ 教程】九、C++中字符型、字符串和转义字符
  4. xampp mysql登录失败_XAMPP修改mysql的root密码phpmyadmin无法登陆
  5. okhttp3 请求html页面,OkHttp3源码详解(二) 整体流程
  6. android java函数_java – 在android中创建全局函数
  7. 新法案下 苹果或被禁止在设备上预装自家应用
  8. PCL之体素网格滤波器--VoxelGrid
  9. 为免费吃饭 黑客入侵餐馆管理系统改数据
  10. Spring boot 集成极光推送
  11. 计算机应用基础精品课程申报表,“大学计算机基础”校级精品课程组积极申报2020年山西省精品共享课程...
  12. win10系统 开启蓝牙服务器,Win10打开蓝牙的方法步骤详解
  13. 解决上传 Gitee 后图片显示不出来
  14. Android投屏神器scrcpy
  15. web个人学习笔记(待完善)
  16. cmd 测试服务器通过延迟,网络延迟测试_怎么测试网络延迟?
  17. AutoVue教程:如何在64位Linux上安装AutoVue
  18. php里切换不了输入法,电脑中怎么切换输入法
  19. 打印钻石图形python_Python pandas高效数据处理之绘图
  20. 2022年N1叉车司机考试题模拟考试题库模拟考试平台操作

热门文章

  1. BES LINEIN 讲解
  2. 图标icon,图标icon资源
  3. 回忆高中数学--概述“奇变偶不变,符号看象限”
  4. 计算机组成原理实验logisim(三)之偶校验编码与检错
  5. 小陈学JS return语句+break,continue,return的区别
  6. 数据库 ----- 实验三:SQL的查询
  7. 二项分布的期望和方差
  8. 【考前冲刺整理】20220812
  9. php 快递单号生成规则,Thinkphp 生成订单号小案例
  10. mysql函数if为负数_MySQL的if,case语句