3月24日练习

第五题:最优配餐

 

考点:多源bfs

当权重(每条边开销为1)的最短路问题可以用bfs

做法:将每个分店先入队,然后依次对每个分店向前后左右走,只要能到达客户那里那么当前饭店就是距离客户最近的饭店,满足了这个客户以后要对这个用户标注不重复遍历。

算法思想:

#include<bits/stdc++.h>
using namespace std;
//方向向量
int dx[4] ={0,0,-1,1};
int dy[4]={1,-1,0,0};
const int N=1006;
struct restaurant{int l;//列 int h;//行int step;//经过多少步 
};
bool vis[N][N];//当他为true时表示是障碍点,或者是饭店经过已经扫描过的点
//用户订单数和位置可以通过地图上的点带有的权值表示
//即graph[i][j]表示(i,j)上所有用户下单的数目总和是graph[i][j] 
int graph[N][N];
int n,m,k,d;
queue<restaurant>dl;//饭店队列 
long long int ans;
bool check(int p,int q){//检查(p,q)这个点是否能走
if(vis[q][p]){//已经走过 return false;	
}
if(p<1||p>n||q<1||q>n) {//越界 return false;
}
return true;	
}
void bfs(){while(!dl.empty()){restaurant a=dl.front();dl.pop();//前后左右四个方向走(其实有点像那个海岛淹没的题目)for(int i=0;i<4;i++) {int xx=a.l+dx[i];int yy=a.h+dy[i];if(check(xx,yy)){//只要是能经过这个点就需要放入队列,并且标注该点已经访问vis[yy][xx]=true;restaurant b;b.h=yy;b.l=xx;b.step=a.step+1;dl.push(b); if(graph[yy][xx]){//是顾客ans=ans+b.step*graph[yy][xx];	}}}}
}
int main(){cin>>n>>m>>k>>d;//饭店 for(int i=0;i<m;i++) {restaurant a;cin>>a.l;cin>>a.h;a.step=0;//初始1步还未走 dl.push(a);vis[a.h][a.l]=true;}//顾客 int x,y,c;for(int i=0;i<k;i++){cin>>x>>y>>c;graph[y][x]+=c;}//障碍for(int i=0;i<d;i++){cin>>x>>y;vis[y][x]=true;}bfs();cout<<ans;return 0; 
}

第一题:无线网络

考点:bfs+邻接表建图

对于这种权值为1的最小值问题优先考虑bfs

 

完整代码:

/*
对题目理解:
1.原有路由器n个,可选择的新增路由器m个但是最多选择k个 
2.两个路由器之间的距离小于等于r才能通信-->所以可以将能通信的所有路由器连接成一个图用邻接表存储 
3.求第一个->第二个路由之间的路由至少是多少个才能通信
有点偏动态规划的想法求最值 
4.可以设计dist数组,dist[i][j]表示从第一个路由器到第i个路由器 其中新增j个路由器经过的路由器个数(不算起点)
5.最短路径(最少路由器个数问题,每一个路由器权值为1)-->bfs
6.队列 里面放的元素形如{i,j}表示从第一个路由器到第i个路由器其中经过了j个新增路由器 
*/
#include<bits/stdc++.h> 
using namespace std;
const int N=206;//路由器最多不超过200个
int n,m,k,r;
struct {int x;//列int y;//行 
}router[N]; 
//邻接表存图
int h[N];//头指针
int e[2*N];
int idx;
int ne[2*N];
int dist[N][N];
typedef pair<int,int> PII; 
void add(int a,int b){//很重要! e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
int bfs(){
int ans=260;
memset(dist,300,sizeof(dist));
dist[1][0]=0;
queue<PII>q;
q.push({1,0});
while(!q.empty()){PII a=q.front();q.pop();int anum=a.first;//当前路由器编号for(int i=h[anum];i!=-1;i=ne[i]) {int bnum=e[i];//相邻的路由器编号int anew=a.second;//当前已经选择了多少新路由器if(bnum>n){//相邻的这个路由器是新增 anew++;}if(anew<=k) {//可以新增if(dist[bnum][anew]>dist[anum][a.second]+1) {//如果相邻的这个路由器可以用当前的更新-->就要更新,并且放进队列,因为可能在最短路上dist[bnum][anew]=dist[anum][a.second]+1;q.push({bnum,anew}) ;}}}
}
for(int i=0;i<=k;i++){ans=min(ans,dist[2][i]);
}
return ans-1;
}
bool check(int i,int j) {if((router[i].x-router[j].x)*(router[i].x-router[j].x)+(router[i].y-router[j].y)*(router[i].y-router[j].y)<=r*r){return true;}return false;
}
int main(){memset(h,-1,sizeof(h));//初始化头指针 cin>>n>>m>>k>>r;//用路由器编号代表路由器 //1~n号路由器是已经有的路由器for(int i=1;i<=n;i++) {cin>>router[i].x>>router[i].y;}//n+1~n+m号路由器是可以选择的新增路由器for(int i=n+1;i<=n+m;i++) {cin>>router[i].x>>router[i].y;}//两台路由器之间的距离小于等于r就可以通信,把能通信的所有路由器连成图for(int i=1;i<=n+m;i++) {for(int j=1;j<=n+m;j++){if(check(i,j)){//能通信//因为是无向图所以两个方向都要连 add(i,j);add(j,i);	}}}cout<<bfs();return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/905400.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lc 315. 计算右侧小于当前元素的个数

```C typedef struct Node {int num; // 值int index; // 原数组索引int size; // 逆序对数量 } Node;class Solution { public:void mergeSort(vector<Node> &arr, int left, int right) {if (left >= right) return;int mid = (left + right) >> 1;…

windows 修改chrome默认安装目录

现在最新版的 Chrom 在安装时仍然不允许用户选择安装路径, 32 位版本会安装到 C:\Program Files (x86)\Google\Chrome 目录,64 位版本会安装到 C:\Program Files\Google\Chrome 目录,而其用户数据目录仍然被设置在当前用户目录下 C:\Users\%USERPROFILE%\AppData\Local\Goog…

Android 8.0系统的通知栏适配

为什么要进行通知栏适配? 现在经常是早上一觉醒来拿起手机一看,通知栏上全是各种APP的推送,烦。随着智能手机发展的成熟,通知栏搞得越来越不讨人喜欢了。各个App都希望抢占通知栏的空间,来尽可能地销售自己的产品。 通知栏是Android系统原创的,虽说乔布斯一直认为Android…

日事清25年战略目标如何高效执行?企业组织架构优化与项目管理全流程解析

如何使用日事清搭建一份可实现的25年战略目标-执行体系?在这个快节奏的商业世界里,每个企业都需要弄清楚几个超重要的问题: 首先,你的企业使命和抱负够不够清晰 ——能不能让每一个员工充满归属感和使命感? 然后,你们团队有没有一个明确的目标体系?还是只是在“摸着石头…

Obsidian 笔记一键转换发布为 Jekyll 博客

Obsidian 是一款功能强大且灵活的知识管理和笔记软件,与 Jekyll 这一轻量级静态博客框架的结合,既能保留 Obsidian 的网状知识关联优势,又能借助 Jekyll 的高效编译能力快速生成标准化博文。 Obsidian 笔记自动转换为 Jekyll 博客一文介绍了如何把挑选出的 Obsidian 笔记转换…

变更《营业执照》操作流程

第一步:打开甘肃政务服务网 https://zwfw.gansu.gov.cn/ 第二步:登录 (1)右上角(2)点“法人登录”(3)点“电子营业执照登录”第三步:使用【电子营业执照】的【扫一扫】进行登录 (1)打开法人的手机微信,在微信中搜索“电子营业执照小程序”(2)点击“扫一扫”(3)…

DVWA靶场安装教程

1 靶场下载github 下载 https://github.com/digininja/DVWAgithub网站在国外,有时不能访问,可以下载我分享的这个:百度网盘分享 https://pan.baidu.com/s/1vIsf_VFiY9Ah3DG3Ichsyg?pwd=zyvf 2 靶场部署 2.1 解压缩靶场 解压缩后,只保留DVWA-master文件夹,里面是靶场代码…

leaflet框选范围下载地图离线瓦片:以高德地图为例(附源码下载)

demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。 运行工具:vscode或者其他工具。 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖包命令:npm i (2)启动Node后端接口命令:node nodeServer.js (3)打…

Python 也能做前端?用 Streamlit + LangChain 搭建 AI Chat 应用!

项目成果 使用 LangChain 处理对话逻辑,包括消息存储、上下文管理。 使用 Streamli项目成果使用 LangChain 处理对话逻辑,包括消息存储、上下文管理。 使用 Streamlit 构建前端 UI,实现流式输出对话体验。 调用 OpenAI API 进行智能问答,使 AI 能够自然交互。 支持对话历史…

春雨

在某一瞬间抛下了自己的灵魂,任由祂对着死去的肉体宣泄、嘶吼、哀悼。 折断笔不去书写过往,可回想的每一刻都值得记录。 工作、学习、人际关系、比赛、生活, 或者说焦虑、压力、责任、情感、不甘, 为什么不想想,把生活放到第一位。 在这苦难中,对知识的渴望和情感的向往刺…

leetcode每日一题:对角线上不同值的数量差

题目 2711. 对角线上不同值的数量差 给你一个下标从 0 开始、大小为 m x n 的二维矩阵 grid ,请你求解大小同样为 m x n 的答案矩阵 answer 。 矩阵 answer 中每个单元格 (r, c) 的值可以按下述方式进行计算:令 topLeft[r][c] 为矩阵 grid 中单元格 (r, c) 左上角对角线上 不…

Linux基本功

知识来源:B站-尚硅谷-武晟然 https://www.bilibili.com/video/BV1WY4y1H7d3/?spm_id_from=333.337.search-card.all.click&vd_source=d9e91669cbb2a200e91188c38bf38a7a 第01章_常用基本命令 ​ Shell 可以看作是一个命令解释器,为我们提供了交互式的文本控制台界面。我…