这里首先奉上代码。最近有点忙。下次再发题解。

#include<stdio.h>
#include<iostream>
#include<queue>
#include<vector>
#include<stdlib.h>
#include<algorithm>
#include<math.h>
#include<memory.h>
using namespace std;
const int root = 1;
const int INF = 1<<30;
const int MAX_T = 1000002;
const int MAX_N = 302;
const int MAX_D = 4;
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
//init
inline int absdist(int value)
{return value>0?value:-value;
}
struct rnode
{int x;int y;int ID;
};
struct rnode R[MAX_N]; //input_gnode
int discretx[MAX_N]; //discret
int discrety[MAX_N]; //discret
int rememx[MAX_N];  //init_x
int rememy[MAX_N];  //init_y
int lengthx; //discret_x_length
int lengthy; //discret_y_length
int findx[MAX_T]; //x->discret_x
int findy[MAX_T]; //y->discret_y
int numx[MAX_T];
int numy[MAX_T];
//
struct gnode
{int x,y;
}; //info
queue <struct gnode> Q;
bool used[MAX_N][MAX_N];
int dist[MAX_N][MAX_N];
struct gnode head,next;
struct tnode
{int homex;int homey;int value;
};
struct tnode G[MAX_N][MAX_N];
//
int ans = 0;
int N;
int Y,C; //Y*C
int Sx,Sy;
int Tx,Ty;
int times ;
bool flag = true ; //ans
void init_rem()
{int i;for (i=1;i<=N;i++)if (numx[R[i].x]>1||numx[R[i].x-1]>=1||numx[R[i].x+1]>=1)rememx[i+N*0]=R[i].x,rememx[i+N*1]=R[i].x-1,rememx[i+N*2]=R[i].x+1;else rememx[i+N*0]=R[i].x;for (i=1;i<=N;i++)if (numy[R[i].y]>1||numy[R[i].y-1]>=1||numy[R[i].y+1]>=1)rememy[i+N*0]=R[i].y,rememy[i+N*1]=R[i].y-1,rememy[i+N*2]=R[i].y+1;else rememy[i+N*0]=R[i].y;sort(rememx+1,rememx+N*3+1);sort(rememy+1,rememy+N*3+1);
}
void note_rem()
{int i;lengthx = 0;discretx[lengthx] = -1;for (i=1;i<=N*3;i++)if (rememx[i]!=discretx[lengthx]) discretx[++lengthx]=rememx[i];lengthy = 0;discrety[lengthy] = -1;for (i=1;i<=N*3;i++)if (rememy[i]!=discrety[lengthy]) discrety[++lengthy]=rememy[i];Y=lengthx;C=lengthy;
}
void build_finding()
{int i;for (i=1;i<=Y;i++)findx[discretx[i]]=i;for (i=1;i<=C;i++)findy[discrety[i]]=i;
}
void init_G()
{int i,j;for (i=1;i<=Y;i++)for (j=1;j<=C;j++)G[i][j].homex = discretx[i] , G[i][j].homey = discrety[j] , G[i][j].value = 0;for (i=1;i<=N;i++)G[findx[R[i].x]][findy[R[i].y]].value = R[i].ID;G[findx[R[root].x]][findy[R[root].y]].value= N+1;
}
void discret()
{init_rem();note_rem();build_finding();init_G();
}
void init()
{int i;scanf("%d",&N);for (i=1;i<=N;i++)scanf("%d %d",&R[i].x,&R[i].y),R[i].ID=i,numx[R[i].x]++,numy[R[i].y]++;discret();
}
bool in_G(int x,int y)
{if (x<1) return false;if (y<1) return false;if (x>Y) return false;if (y>C) return false;return true;
}
int distc(int x1,int y1,int x2,int y2)
{return (absdist(G[x1][y1].homex-G[x2][y2].homex)+absdist(G[x1][y1].homey-G[x2][y2].homey));
}
void init_SPFA()
{Sx=findx[R[times-1].x];Sy=findy[R[times-1].y];Tx=findx[R[times<=N?times:1].x];Ty=findy[R[times<=N?times:1].y];memset(dist,1,sizeof(dist));memset(used,false,sizeof(used));head.x = Sx;head.y = Sy;used[Sx][Sy]=true;dist[Sx][Sy] = 0;Q.push(head);
}
//mainwork
void SPFA()
{if (!flag) return ;bool route = false;while (!Q.empty()){head = Q.front();Q.pop();if (head.x==Tx&&head.y==Ty) {route = true ; continue ;}int i;for (i=0;i<MAX_D;i++){next.x=head.x+dx[i];next.y=head.y+dy[i];if (!in_G(next.x,next.y)) continue;if (G[next.x][next.y].value&&G[next.x][next.y].value!=times) continue;if (used[next.x][next.y]) continue;dist[next.x][next.y]=dist[head.x][head.y]+distc(next.x,next.y,head.x,head.y);used[next.x][next.y]=true;Q.push(next);}}if (!route)ans=INF,flag = false;else ans+=dist[Tx][Ty];
}
//
void work()
{for (times = 2;times<= N+1;times++){init_SPFA();SPFA();}
}
void put()
{if (ans==INF) ans=-1;printf("%d",ans);
}
int main()
{freopen("delivery.in","r",stdin);freopen("delivery.out","w",stdout);init();work();put();return 0;
}

delivery route配送路线相关推荐

  1. Matlab【路径规划】—— 无人机药品配送路线最优化

    文章目录 问题描述 具体思路 demo1:求解所有节点间的距离 demo2:直升机配送路线规划算法 demo3:寻找最优解的优化算法 支撑材料&工程附件 问题描述 某市引进一架专业大型无人机用 ...

  2. 粒子群算法求解物流配送路线问题(python)

    粒子群算法求解物流配送路线问题(python) 1.查找论文文献 找一篇物流配送路径优化+粒子群算法求解的论文 参考文献:基于混沌粒子群算法的物流配送路径优化 2.了解粒子群算法的原理 讲解通俗易懂, ...

  3. 2019ICPC(银川) - Delivery Route(强连通缩点+分块最短路)

    题目链接:点击查看 题目大意:给出n个点和m条边构成的图,每条边都有权值,其中m1条边是双向的,且权值非负,有m2条边是单向的,且权值可负,现在要求从给定起点st到其他每个点的最短路,若不存在路径则输 ...

  4. 2019 ICPC Asia Yinchuan Regional H - Delivery Route 强连通+最短路+拓扑

    原题链接:https://nanti.jisuanke.com/t/42388 目录 题意 分析 Code 题意 有n个点,x条双向边且边权为正,y条单向边边权可以为负,问从某个点出发到全部点的最短距 ...

  5. javascript验证_使用JavaScript验证信用卡

    javascript验证 We all know that JavaScript shouldn't be a web form's only method of validation but cli ...

  6. 乐外卖物流配送调度系统设计

    摘要 随着互联网时代的发展,以及人们对生活品质的追求,订外卖已经成为了一种普遍的消费行为,外卖因其快捷便利性广受青睐,也因配送不及时,不准确倍受指摘.为了改善当前外卖配送过程中存在的配送速度不能保证, ...

  7. dijikstra 旅行商问题_第27期:基于旅行商问题(TSP)的配送网络优化—R实现

    回国后,没有时间休息,一是工作不能耽误,二是很多杂乱的事情要处理,因此,公众号很久没有更新,实在抱歉! 本期的推文是关于旅行商问题(TSP)的配送网络优化,也是因为最近在指导学生参加省大学生现代物流设 ...

  8. 物流matlab,物流配送线路优化Matlab算法研究

    [摘 要]"最后一公里"的配送问题属于物流配送车辆路径优化问题.针对物流配送线路选取过程中所缺乏的可嵌入系统的简易优化算法的缺陷,提出了基于逐点调整法.双点交换法的综合算法.该方法 ...

  9. 基于C语言Win32API窗口实现的物流配送信息管理系统

    一.题目 物流配送管理信息系统 二.系统功能模块结构图 2.1 函数程序模块结构图如图 1 所示: 图 1 2.2 录入子菜单功能结构图如图 2 所示: 图 2 2.3 插入的子菜单的功能结构图如图 ...

最新文章

  1. 这是我的第一篇博客!
  2. 计算营业额的python代码_【每日一练】巧用python实现利润计算
  3. boost:验证Boost概念检查的class_requires 库应该在预期的时间内捕获错误
  4. 使用aconda3-5.1.0(Python3.6.4) 搭建pyspark远程部署
  5. java 并发 主键_高并发数据库自增主键分析
  6. 谷歌浏览器如何如何禁用弹出窗口阻止程序
  7. 基础研究到底要基础到什么程度?
  8. CentOS6.5 安装ORACLE 安装界面乱码解决方案
  9. 在Google使用Borg进行大规模集群的管理 5-6
  10. 计算机二级34套word答案,全国计算机二级C选择题题库第34套
  11. 29. 数组中出现超过一半的数字(C++版本)
  12. 使用折半查找法查找数组中的元素
  13. 条码扫描枪在仓库管理无线网络AP解决方案
  14. Eureka入口之DiscoveryClient
  15. PHP 中的 use function是什么意思
  16. 最好用的 8 款 React Datepicker 时间日期选择器测评推荐
  17. iconfont是什么?
  18. uniapp 图片模糊解决方案
  19. 我的世界Mods/制作(1)
  20. 【Unity VR开发】结合VRTK4.0:不可移动区域

热门文章

  1. 查找字符串中指定字符的位置c语言,C语言中查找字符在字符串中出现的位置的方法...
  2. 【微信小程序】(三)订阅消息实现
  3. 计算机故障检测与维修备课,计算机故障诊断与维护PPT教案.pptx
  4. uvwmap的UVW含义简述
  5. 学习Python编程的原因
  6. 如何批量完成PPT转换成PDF
  7. 强大多云混合多K8S集群管理平台Rancher入门实战
  8. centos 安装内核头文件_centos 内核头文件的安装操作方法
  9. 程序员加班之歌(中英文版)
  10. 小圆象PDF:图片转PDF转换器有哪些?掌握职场必备转换技能