delivery route配送路线
来源:互联网 发布:阿里云和腾讯云是什么 编辑:程序博客网 时间:2024/04/28 12:30
这里首先奉上代码。最近有点忙。下次再发题解。
#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};//initinline int absdist(int value){ return value>0?value:-value;}struct rnode{ int x; int y; int ID;};struct rnode R[MAX_N]; //input_gnodeint discretx[MAX_N]; //discretint discrety[MAX_N]; //discretint rememx[MAX_N]; //init_xint rememy[MAX_N]; //init_yint lengthx; //discret_x_lengthint lengthy; //discret_y_lengthint findx[MAX_T]; //x->discret_xint findy[MAX_T]; //y->discret_yint numx[MAX_T];int numy[MAX_T];//struct gnode{ int x,y;}; //infoqueue <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*Cint 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);}//mainworkvoid 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配送路线
- bzoj1266【AHOI2006】上学路线route
- 1266: [AHOI2006]上学路线route
- bzoj1266: [AHOI2006]上学路线route
- 1266: [AHOI2006]上学路线route
- BZOJ1266: [AHOI2006]上学路线route
- 1266: [AHOI2006]上学路线route
- bzoj 1266 [AHOI2006] 上学路线 route 题解
- 高德地图route(路线)+GPS
- bzoj 1266: [AHOI2006]上学路线route
- BZOJ1266 上学路线route(最小割)
- BZOJ 1266: [AHOI2006]上学路线route
- bzoj 1266: [AHOI2006]上学路线route
- Delivery
- google map public transit route (大众运输路线)
- 高德地图api之路线规划(Route)
- BZOJ 1266 AHOI2006 上学路线route Floyd+最小割
- BZOJ 1266 AHOI 2006 上学路线route 最小割
- 1030UBUNTU下将SD卡分区格式化成ext4的操作
- Documentation\device-mapper\thin-provisioning.txt
- ActionBar(4) 自定义布局及下拉列表导航
- CODE 97: Valid Sudoku
- centos下vi的用法大全
- delivery route配送路线
- 对cortex m3省电模式的理解
- Java连接Oracle简单代码示例
- DokuWiki的安装
- 一道关于组合的问题,例如ABCD,他们有多少种组合,请你输出来,算法有两种。
- C语言学习简记
- fastdfs概要介绍
- storm-0.8.2源码分析之nimbus运行过程(一)
- nginx介绍及编译安装