最短路项目辅助代码
1 #define DeBUG 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 #include <cstdlib> 7 #include <algorithm> 8 #include <vector> 9 #include <stack> 10 #include <queue> 11 #include <string> 12 #include <set> 13 #include <sstream> 14 #include <map> 15 #include <bitset> 16 #include <windows.h> 17 using namespace std ; 18 #define zero {0} 19 #define INF 2000000000 20 #define EPS 1e-6 21 typedef long long LL; 22 #define WIDTH 16 23 #define HEIGHT 10 24 const double PI = acos(-1.0); 25 inline int sgn(double x) 26 { 27 return fabs(x) < EPS ? 0 :(x < 0 ? -1 : 1); 28 } 29 #define n 80 30 int mp[n+1][n+1]; 31 const short shop_map[10][16] = { 32 { 1, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 33 }, 34 { 2, 3, 4, 5, 0, 6, 75, 7, 8, 73, 9, 10, 0, 11, 254, 254 35 }, 36 { 39, 254, 254, 254, 254, 254, 52, 254, 254, 58, 254, 63, 254, 11, 0, 66 37 }, 38 { 40, 254, 254, 254, 254, 254, 53, 254, 254, 58, 254, 0, 254, 254, 254, 67 39 }, 40 { 41, 12, 13, 14, 77, 15, 0, 16, 17, 74, 18, 19, 20, 76, 21, 67 41 }, 42 { 42, 254, 254, 254, 47, 254, 54, 254, 254, 59, 254, 254, 254, 64, 254, 68 43 }, 44 { 43, 22, 23, 24, 48, 25, 55, 26, 0, 60, 27, 28, 0, 65, 29, 69 45 }, 46 { 44, 254, 254, 254, 49, 254, 56, 254, 254, 61, 254, 254, 254, 254, 254, 70 47 }, 48 { 45, 30, 31, 32, 50, 33, 57, 34, 0, 62, 35, 36, 37, 0, 38, 71 49 }, 50 { 46, 254, 254, 254, 51, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 72 51 } 52 }; 53 char road[100][100]; 54 /** 55 * [Dijkstra description] 56 * @param mp 权值矩阵,从1开始 57 * @param n 点数 58 * @param s 起始点 59 * @param t 终点 60 * @param path 起始点到各点的路(前驱) 61 * @return 起点到终点的最短长度 62 */ 63 int Dijkstra(int s,int t, int path[]) 64 { 65 int i,j,w,minc; 66 bool visit[n+1]; 67 int price[n+1]; 68 for(i=1; i<=n; i++) 69 visit[i]=false; 70 for(i=1; i<=n; i++) 71 { 72 price[i]=mp[s][i]; 73 path[i]=s; 74 } 75 visit[s]=true; 76 price[s]=0; 77 //path[s]=0; 78 for(i=1; i<n; i++) 79 { 80 minc=INF; 81 w=0; 82 for(j=1; j<=n; j++) 83 if((visit[j]==false)&&(minc>=price[j])) 84 { 85 minc=price[j]; 86 w=j; 87 } 88 visit[w]=true; 89 for(j=1; j<=n; j++) 90 if((visit[j]==false)&&(mp[w][j]!=INF)&&(price[j]>price[w]+mp[w][j])) 91 { 92 price[j]=price[w]+mp[w][j]; 93 path[j]=w; 94 } 95 } 96 return price[t]; 97 } 98 int dir[4][2]= {-1,0,1,0,0,-1,0,1}; 99 void init() 100 { 101 for(int i=1; i<=n; i++) 102 { 103 for(int j=1; j<=n; j++) 104 { 105 mp[i][j]=INF; 106 } 107 } 108 memset(road,0,sizeof(road)); 109 int w; 110 for(int i=0; i<10; i++) 111 { 112 for(int j=0; j<16; j++) 113 { 114 for(int k=0; k<4; k++) 115 { 116 w=1; 117 int nowx=i; 118 int nowy=j; 119 if(shop_map[i][j]==254) 120 { 121 road[i+1][j+1]='#'; 122 } 123 nowx+=dir[k][0]; 124 nowy+=dir[k][1]; 125 while(shop_map[nowx][nowy]==0&&nowx>=0&&nowy>=0&&nowx<HEIGHT&&nowy<WIDTH) 126 { 127 w++; 128 nowx+=dir[k][0]; 129 nowy+=dir[k][1]; 130 } 131 if(nowx<0||nowy<0||nowx>=HEIGHT||nowy>=WIDTH||shop_map[nowx][nowy]==254) 132 continue; 133 int a=shop_map[i][j]; 134 int b=shop_map[nowx][nowy]; 135 if(a>=1&&a<=n&&b>=1&&b<=n) 136 { 137 mp[a][b]=1; 138 mp[b][a]=1; 139 } 140 } 141 } 142 } 143 } 144 int main() 145 { 146 #ifdef DeBUGs 147 //freopen("C:\\Users\\Sky\\Desktop\\1.in","r",stdin); 148 freopen("C:\\Users\\Sky\\Desktop\\dabiao.txt","w",stdout); 149 #endif 150 int m; 151 int path[n+1]; 152 init(); 153 int s=1; 154 int t=7; 155 int value=Dijkstra(s,t,path); 156 157 158 //////////////生成地图权值数据 159 // printf("%d\n", n); 160 // printf("{"); 161 // for(int i=0;i<n;i++) 162 // { 163 // printf("{" ); 164 // printf("%d", mp[i][0]); 165 // for(int j=1;j<n;j++) 166 // { 167 // printf(",%d",mp[i][j]==INF?-1:mp[i][j]); 168 // } 169 // printf("},\n"); 170 // } 171 // printf("};"); 172 173 174 /////////测试用 175 for(int i=1; i<=n; i++) 176 { 177 int k=i; 178 char nowroad[100][100]; 179 memcpy(nowroad,road,sizeof(nowroad)); 180 nowroad[1][1]='*'; 181 while(k!=s) 182 { 183 //printf("%d<--",k); 184 for(int i=0;i<10;i++) 185 for(int j=0;j<16;j++) 186 { 187 if(shop_map[i][j]==k) 188 { 189 nowroad[i+1][j+1]='*'; 190 } 191 } 192 k=path[k]; 193 } 194 printf("-------------------- %d\n",i); 195 for(int i=1;i<=HEIGHT;i++) 196 { 197 for(int j=1;j<=WIDTH;j++) 198 { 199 printf("%c", nowroad[i][j]); 200 } 201 printf("\n"); 202 } 203 Sleep(1000); 204 //printf("%d\n",s); 205 } 206 printf("%d\n", value); 207 return 0; 208 }