题—送外卖2(最短路径dfs)
送外卖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)相关推荐
- 2021第六届数维杯大学生数学建模竞赛赛题_A 外卖骑手的送餐危机
外卖骑手的送餐危机 外卖业务已经成为了大城市上班族每日生活中不可或缺的一部分.根据美团2020年6月发布的<2019中国即时配送行业发展报告>中显示,2019年我国即食配送业务订单规模达到 ...
- PTA L2-043龙龙送外卖
4.1.6 L2-043龙龙送外卖 题目地址:https://pintia.cn/problem-sets/994805046380707840/exam/problems/1518582482059 ...
- PTA L2-043 龙龙送外卖
龙龙送外卖 龙龙是"饱了呀"外卖软件的注册骑手,负责送帕特小区的外卖.帕特小区的构造非常特别,都是双向道路且没有构成环 -- 你可以简单地认为小区的路构成了一棵树,根结点是外卖站, ...
- 谁说程序员过了35岁之后就要去“送外卖”、“跑滴滴”?这几种发展走向照样解除焦虑
前段时间在技术交流群里聊天,无意间说到了程序员35岁之后的未来规划,说到未来,大多数人都是"跑滴滴"."送外卖",虽是玩笑话,但的确是很迷茫. 说到程序员,在外 ...
- LibreOJ #6177. 「美团 CodeM 初赛 Round B」送外卖2【状压DP】
「美团 CodeM 初赛 Round B」送外卖2 内存限制:32 MiB 时间限制:200 ms 题目描述 一 张 n 个 点 m 条 有 向 边 的 图 上 , 有 q 个 配 送 需 求 , 需 ...
- 知乎热议:浙大读博八年现靠送外卖赚钱
点击上方"码农突围",马上关注 这里是码农充电第一站,回复"666",获取一份专属大礼包 真爱,请设置"星标"或点个"在看&quo ...
- 美团面试都面不过?我又不是去送外卖的!美团Java面试经历总结【一面、二面、三面】
美团面试都面不过?我又不是去送外卖的!美团Java面试经历总结[一面.二面.三面]这篇文章主要介绍了美团Java面试经历,总结分析了美团java三轮面试中所遇到的各种问题,对于参与java面试有一定参 ...
- HNUSTOJ-1698 送外卖(TSP问题 + 状态压缩DP)
1698: 送外卖 时间限制: 1 Sec 内存限制: 128 MB 提交: 123 解决: 28 [ 提交][ 状态][ 讨论版] 题目描述 在美团和饿了么大行其道的今天,囊中羞涩的小周和小美, ...
- 浙大读博八年现靠送外卖赚钱,本人:进组以来博士无一人按时毕业
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 杨净 发自 凹非寺 量子位 | 公众号 QbitAI 浙大在读博士, ...
最新文章
- 还不错的Table样式和form表单样式
- JS获取div滚动条距离实现弹出标签位置动态移动
- 【小白学习C++ 教程】九、C++中字符型、字符串和转义字符
- xampp mysql登录失败_XAMPP修改mysql的root密码phpmyadmin无法登陆
- okhttp3 请求html页面,OkHttp3源码详解(二) 整体流程
- android java函数_java – 在android中创建全局函数
- 新法案下 苹果或被禁止在设备上预装自家应用
- PCL之体素网格滤波器--VoxelGrid
- 为免费吃饭 黑客入侵餐馆管理系统改数据
- Spring boot 集成极光推送
- 计算机应用基础精品课程申报表,“大学计算机基础”校级精品课程组积极申报2020年山西省精品共享课程...
- win10系统 开启蓝牙服务器,Win10打开蓝牙的方法步骤详解
- 解决上传 Gitee 后图片显示不出来
- Android投屏神器scrcpy
- web个人学习笔记(待完善)
- cmd 测试服务器通过延迟,网络延迟测试_怎么测试网络延迟?
- AutoVue教程:如何在64位Linux上安装AutoVue
- php里切换不了输入法,电脑中怎么切换输入法
- 打印钻石图形python_Python pandas高效数据处理之绘图
- 2022年N1叉车司机考试题模拟考试题库模拟考试平台操作