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;}