数据结构1 07-图5 Saving James Bond - Hard Version
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<math.h> 3 #define MAXN 102 4 #define INF 1000000000 5 struct pos{ 6 int x,y; 7 }; 8 struct edge{ 9 int v1,v2; 10 }; 11 struct pos p[MAXN]; 12 int g[MAXN][MAXN],vis[MAXN],n,d,flag,dist[MAXN],w[MAXN][MAXN],weight[MAXN],path[MAXN]; 13 void init(); 14 void read(); 15 void creatg(); 16 void dijkstra(int x); 17 double dis(struct pos p1,struct pos p2); 18 int main(){ 19 int i; 20 flag=0; 21 read(); 22 creatg(); 23 dijkstra(0); 24 if(dist[n+1]!=INF){ 25 printf("%d\n",dist[n+1]); 26 int stack[MAXN],top=0,pre; 27 pre = path[n+1]; 28 while(pre!=0){ 29 stack[top++] = pre; 30 pre = path[pre]; 31 } 32 for(i=top-1;i>=0;i--){ 33 pre = stack[i]; 34 if(pre!=0&&pre!=n+1) 35 printf("%d %d\n",p[pre].x,p[pre].y); 36 } 37 38 39 } 40 else printf("0\n"); 41 return 0; 42 } 43 void init(){ 44 int i,j; 45 46 for(i=0;i<=n+1;i++) 47 for(j=0;j<=n+1;j++) 48 { 49 g[i][j] = INF; 50 w[i][j] = INF; 51 } 52 } 53 void read(){ 54 int i,j; 55 scanf("%d %d",&n,&d); 56 init(); 57 for(i=1;i<=n;i++) 58 scanf("%d %d",&p[i].x,&p[i].y); 59 } 60 double dis(struct pos p1,struct pos p2){ 61 double temp; 62 temp = pow((p1.x-p2.x),2) + pow((p1.y-p2.y),2); 63 return sqrt(temp); 64 } 65 void creatg(){ 66 int i,j; 67 double t; 68 struct pos o; 69 o.x = 0; 70 o.y = 0; 71 if((50-15.2)<=d){ 72 g[0][n+1] = 1; 73 g[n+1][0] = 1; 74 w[0][n+1] = ceil((50-15.2)); 75 w[n+1][0] = w[0][n+1]; 76 } 77 for(i=1;i<=n;i++){ 78 t = (dis(o,p[i])-15/2.0); 79 80 if(t<=d){ 81 g[0][i] = 1; 82 g[i][0] = 1; 83 w[0][i] =ceil(t); 84 w[i][0] =ceil(t); 85 } 86 87 88 if((50-abs(p[i].x))<=d||((50-abs(p[i].y))<=d)){ 89 g[i][n+1] = 1; 90 g[n+1][i] = 1; 91 w[i][n+1] = 1; 92 w[n+1][i] = 1; 93 94 } 95 } 96 for(i=1;i<=n;i++){ 97 for(j=1;j<=n;j++){ 98 if(i!=j && dis(p[i],p[j])<=d){ 99 g[i][j] = 1; 100 g[j][i] = 1; 101 w[i][j] = 1; 102 w[j][i] = 1; 103 } 104 } 105 } 106 } 107 void dijkstra(int x){ 108 int i,mdist,mn; 109 for(i=0;i<MAXN;i++) { dist[i] = INF; weight[i] = INF;} 110 for(i=0;i<=n+1;i++) vis[i]=0; 111 dist[x] = 0; 112 weight[x] =0; 113 while(1){ 114 mdist = INF; 115 mn=-1; 116 for(i=0;i<=n+1;i++) 117 if(mdist > dist[i] && vis[i]==0 ){ 118 mn = i; 119 mdist = dist[i]; 120 } 121 vis[mn] = 1; 122 if(mn==-1) break; 123 for(i=0;i<=n+1;i++){ 124 if(vis[i]==0){ 125 if(g[mn][i]!=INF){ 126 if(g[mn][i]+dist[mn]<dist[i]){ 127 dist[i] = g[mn][i] + dist[mn]; 128 weight[i] = w[mn][i] +weight[mn]; 129 path[i] = mn; 130 } 131 else if(g[mn][i]+dist[mn]==dist[i]){ 132 if(w[mn][i] + weight[mn] < weight[i]){ 133 weight[i] = w[mn][i] +weight[mn]; 134 path[i] = mn; 135 } 136 } 137 } 138 } 139 } 140 141 } 142 143 144 }