haha 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. ///用户名:admin 密码:123456
  2. #include<bits/stdc++.h>/** 注:步行速度为90m/min **/
  3. #define INFINITY 65535 ///无穷大,即不相邻
  4. #define MAX_VERTEX_NUM 20 ///最大的顶点个数
  5. using namespace std;
  6. typedef int VRType;
  7. typedef char InfoType;
  8. typedef struct
  9. {
  10. int num;
  11. char name[20];
  12. char introduce[100];
  13. } VertexType;
  14. typedef struct ArcCell
  15. {
  16. VRType adj; ///距离
  17. InfoType *info;///边的信息
  18. } ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
  19. typedef struct
  20. {
  21. VertexType vex[MAX_VERTEX_NUM];///顶点向量
  22. AdjMatrix arcs; ///邻接矩阵
  23. int vexnum,arcnum; ///顶点数和边数
  24. } MGraph;
  25. VertexType site[11]=
  26. {
  27. {1,"生活区"," 一大群孩子的老巢"},
  28. {2,"球场"," 锻炼身体、休闲娱乐的地方"},
  29. {3,"风雨操场","情侣们秀恩爱的最佳去处"},
  30. {4,"众创空间","集合广播台等高大尚的工作的地方"},
  31. {5,"学苑超市","一个坑钱的地方,thing贼贵"},
  32. {6,"浴室"," 让你出淤泥而不染的地方"},
  33. {7,"知味园"," 小而拥挤、人流量te多还难吃的就餐地方"},
  34. {8,"致知楼"," 结合上课和办公与一体的高端教学楼"},
  35. {9,"敏行楼"," 夏天不热、冬天不冷的实验楼,也是报告厅所在地"},
  36. {10,"图书馆"," 还在建设中,想进去都进不去"},
  37. {11,"学校南门","学校正门,学校的门面,然而基本没开过"}
  38. };
  39. /*****************************************************************************************************************/
  40. /*****************************************************************************************************************/
  41. /******* *******/
  42. /******/ void schoolmap();///学校地图 /******/
  43. /******* *******/
  44. /******/ void menu();///菜单 /******/
  45. /******* *******/
  46. /******/ void create(MGraph &g,VertexType site[]);///创建邻接矩阵 /******/
  47. /******* *******/
  48. /******/ void output(MGraph g,int i);///根据序号i输出对应的地点的相关信息 /******/
  49. /******* *******/
  50. /******/ void search(MGraph g);///查找某个地点信息 /******/
  51. /******* *******/
  52. /******/ void Shortest_Path_Dijkstra(MGraph g,int v0,int P[][20],int D[20]);///Dijkstra算法 /******/
  53. /******* *******/
  54. /******/ void ShortestPath_FLOYD(MGraph g, int P[20][20][20], int D[][20]);///FLOYD算法 /******/
  55. /******* *******/
  56. /******/ void add_arc(MGraph &g);///增加修改地点间路径 /******/
  57. /******* *******/
  58. /******/ void delete_arc(MGraph &g);///删除某一条边 /******/
  59. /******* *******/
  60. /******/ void display_num(MGraph g);///显示所有地点序号名称 /******/
  61. /******* *******/
  62. /******/ void display_all(MGraph g);///输出具体信息 /******/
  63. /******* *******/
  64. /******/ void update(MGraph &g);///修改某一个地点信息 /******/
  65. /******* *******/
  66. /*****************************************************************************************************************/
  67. /*****************************************************************************************************************/
  68. int main()
  69. {
  70. int v1,v2,P1[20][20],P2[20][20][20],D1[20],D2[20][20],i,j,k;
  71. MGraph g;
  72. create(g,site);
  73. printf(" 欢迎来到安科地图导航! \n");
  74. char admin[10]="admin",input[10];
  75. const int pass=123456;
  76. int en;
  77. L:
  78. printf("请输入用户名: ");
  79. scanf("%s",input);
  80. printf("请输入密码: ");
  81. scanf("%d",&en);
  82. if(!strcmp(admin,input)&&en==pass) ;
  83. else
  84. {
  85. printf("用户名/密码错误,请重新输入,嘤嘤嘤qwq\n");
  86. goto L;
  87. }
  88. LL1:
  89. menu();
  90. printf("please intput your choose:");
  91. scanf("%d",&i);
  92. switch(i)
  93. {
  94. case 0:
  95. schoolmap();
  96. goto LL1;
  97. break;
  98. case 1:
  99. display_num(g);
  100. goto LL1;
  101. break;
  102. case 2:
  103. display_all(g);
  104. goto LL1;
  105. break;
  106. case 3:
  107. search(g);
  108. goto LL1;
  109. break;
  110. case 4:
  111. printf("请输入地点的序号:\n");
  112. scanf("%d",&k);
  113. Shortest_Path_Dijkstra(g,k-1,P1,D1);
  114. for(i=1; i<g.vexnum; i++)
  115. {
  116. printf("%d号(%s)到%d号(%s):",k,g.vex[k-1].name,i+1,g.vex[i].name);
  117. for(j=0; P1[i][j]!=-1; j++)
  118. printf("%d号(%s) ",P1[i][j]+1,g.vex[P1[i][j]].name);
  119. printf("\n距离为:%d\n",D1[i]);
  120. puts("");
  121. }
  122. goto LL1;
  123. break;
  124. case 6:
  125. ShortestPath_FLOYD(g,P2,D2);
  126. for(i=0; i<g.vexnum; i++)
  127. {
  128. for(int j=0; j<g.vexnum; j++)
  129. {
  130. if(i!=j)
  131. {
  132. if(D2[i][j]!=INFINITY)
  133. {
  134. cout<<g.vex[i].name<<"到"<<g.vex[j].name<<"的最短时间为:"<<setw(5)<<D2[i][j]/90<<"min"<<", 最短路径为:";
  135. for(int k=0; k<g.vexnum; k++)
  136. {
  137. if(P2[i][j][k]!=-1)
  138. cout<<g.vex[P2[i][j][k]].name<<" ";
  139. else
  140. break;
  141. }
  142. puts("");
  143. }
  144. else
  145. cout<<g.vex[i].name<<"到"<<g.vex[j].name<<"不可达"<<endl;
  146. }
  147. }
  148. puts("");
  149. }
  150. goto LL1;
  151. break;
  152. case 5:
  153. ShortestPath_FLOYD(g,P2,D2);
  154. for(i=0; i<g.vexnum; i++)
  155. {
  156. for(int j=0; j<g.vexnum; j++)
  157. {
  158. if(i!=j)
  159. {
  160. if(D2[i][j]!=INFINITY)
  161. {
  162. cout<<g.vex[i].name<<"到"<<g.vex[j].name<<"的最短长度为:"<<setw(5)<<D2[i][j]<<", 最短路径为:";
  163. for(int k=0; k<g.vexnum; k++)
  164. {
  165. if(P2[i][j][k]!=-1)
  166. cout<<g.vex[P2[i][j][k]].name<<" ";
  167. else
  168. break;
  169. }
  170. puts("");
  171. }
  172. else
  173. cout<<g.vex[i].name<<"到"<<g.vex[j].name<<"不可达"<<endl;
  174. }
  175. }
  176. puts("");
  177. }
  178. goto LL1;
  179. break;
  180. case 7:
  181. add_arc(g);
  182. goto LL1;
  183. break;
  184. case 8:
  185. delete_arc(g);
  186. goto LL1;
  187. break;
  188. case 9:
  189. update(g);
  190. goto LL1;
  191. break;
  192. case 10:
  193. printf("下次再来玩呦,嘤嘤嘤^_^!\n");
  194. exit(0);
  195. goto LL1;
  196. break;
  197. default:
  198. printf("你的输入有误,请重新输入!嘤嘤嘤qwq\n");
  199. goto LL1;
  200. break;
  201. }
  202. return 0;
  203. }
  204. void menu()
  205. {
  206. printf("************************************************************\n");
  207. printf("************************************************************\n");
  208. printf("*** 0.大安科全景地图 ***\n");
  209. printf("*** 1.显示所有地点的序号 ***\n");
  210. printf("*** 2.查询所有地点的信息 ***\n");
  211. printf("*** 3.查询某个地点的具体信息 ***\n");
  212. printf("*** 4.查询某个地点到其他地点的最短路径 ***\n");
  213. printf("*** 5.输出任意两个地点之间的最短路径 ***\n");
  214. printf("*** 6.输出任意两个地点之间的最短时间 ***\n");
  215. printf("*** 7.增加某一条边 ***\n");
  216. printf("*** 8.删除某一条边 ***\n");
  217. printf("*** 9.修改某个地点的具体信息 ***\n");
  218. printf("*** 10.退出系统 ***\n");
  219. printf("************************************************************\n");
  220. printf("************************************************************\n");
  221. }
  222. void schoolmap()
  223. {
  224. printf(" 安科平面图 \n");
  225. printf(" *----------------------------------------------------------------------------*\n");
  226. printf(" | |西门| |\n");
  227. printf(" |----------------------------------------------------------------------------|\n");
  228. printf(" | *----------------* *-----------------* *--------------------------------* |\n");
  229. printf(" | | | | | | 生活区 (1) | |\n");
  230. printf(" | | 风 雨 | | | | *----* *----* *----* *----* | |\n");
  231. printf(" | | | | | | | 德 | | 德 | | 德 | | 德 | | |\n");
  232. printf(" | | 操 场 | | 球场 (2) | | | 馨 | | 馨 | | 馨 | | 馨 | | |\n");
  233. printf(" | | | | | | | 苑 | | 苑 | | 苑 | | 苑 | | |\n");
  234. printf(" | | (3) | | | | | 1 | | 2 | | 3 | | 4 | | |\n");
  235. printf(" | | | | | | *----* *----* *----* *----* | |\n");
  236. printf(" | *----------------* *-----------------* *--------------------------------* |\n");
  237. printf(" | *-----------------------* *----------* |\n");
  238. printf(" | | 间 | 市 | 室 | | *------* | |\n");
  239. printf(" | | 空 | 超 | | | | B | | |\n");
  240. printf(" | | 创 | 苑 | | | | 园 | | |\n");
  241. printf(" | | 众 | 学 | 浴 | | | | | |\n");
  242. printf(" | | (4)| (5) |(6)| | | 味 | | |\n");
  243. printf(" | *-----------------------* | | | | |\n");
  244. printf(" | *---------* | 知 | | |\n");
  245. printf(" | | *--------* | | |\n");
  246. printf(" | | | | | |\n");
  247. printf(" | | | 知味园A | | |\n");
  248. printf(" | *-----------------------------------* | | | | |\n");
  249. printf(" | | *--------* *--------* *-------* | | *---------------* | |\n");
  250. printf(" | | | | | | | | | | (7) | |\n");
  251. printf(" | | | A | | B | | C | | *--------------------* |\n");
  252. printf(" | | | 楼 | | 楼 | | 楼 | | |\n");
  253. printf(" | | | 知 | | 知 | | 知 | | |\n");
  254. printf(" | | | 致 | | 致 | | 致 | | |\n");
  255. printf(" | | | | | | | | | |\n");
  256. printf(" | | *--------* *--------* *-------* | |\n");
  257. printf(" |-----* | (8) | *----------* |\n");
  258. printf(" | 门 | *-----------------------------------* | | |\n");
  259. printf(" | (11)| | 馆 | |\n");
  260. printf(" | | | 书 | |\n");
  261. printf(" | 南 | | 图 | |\n");
  262. printf(" |-----* *-------------------------------------* | (10) | |\n");
  263. printf(" | | (9) | *----------* |\n");
  264. printf(" | | *--------* *--------* *-------* | |\n");
  265. printf(" | | | | | | | | | |\n");
  266. printf(" | | | A | | B | | C | | |\n");
  267. printf(" | | | 楼 | | 楼 | | 楼 | | |\n");
  268. printf(" | | | 行 | | 行 | | 行 | | |\n");
  269. printf(" | | | 敏 | | 敏 | | 敏 | | |\n");
  270. printf(" | | | | | | | | | |\n");
  271. printf(" | | *--------* *--------* *-------* | | 东 门 | |\n");
  272. printf(" *-------*-------------------------------------*-------*-----------*----------*\n");
  273. printf("\n");
  274. }
  275. void create(MGraph &g,VertexType site[])
  276. {
  277. int i,j;
  278. g.vexnum=11;
  279. g.arcnum=12;
  280. for(i=0; i<11; i++)
  281. g.vex[i]=site[i];
  282. for(i=0; i<g.vexnum; i++)
  283. for(j=0; j<g.vexnum; j++)
  284. g.arcs[i][j]= {INFINITY,NULL};
  285. g.arcs[0][1].adj=150;
  286. g.arcs[1][2].adj=100;
  287. g.arcs[2][3].adj=141;
  288. g.arcs[3][4].adj=30;
  289. g.arcs[4][5].adj=30;
  290. g.arcs[5][9].adj=300;
  291. g.arcs[5][10].adj=410;
  292. g.arcs[6][7].adj=210;
  293. g.arcs[6][9].adj=180;
  294. g.arcs[0][4].adj=160;
  295. g.arcs[0][7].adj=400;
  296. g.arcs[9][10].adj=310;
  297. g.arcs[7][8].adj=190;
  298. for(i=0; i<g.vexnum; i++)
  299. for(j=0; j<g.vexnum; j++)
  300. g.arcs[j][i].adj= g.arcs[i][j].adj;
  301. }
  302. void output(MGraph g,int i)
  303. {
  304. printf("地点序号:%d\n",i);
  305. printf("地点名称:%s\n",g.vex[i-1].name);
  306. printf("地点简介:%s\n",g.vex[i-1].introduce);
  307. }
  308. void search(MGraph g)
  309. {
  310. int i;
  311. printf("请输入你想查找地点的序号:");
  312. scanf("%d",&i);
  313. output(g,i);
  314. }
  315. void Shortest_Path_Dijkstra(MGraph g,int v0,int P[][20],int D[20])
  316. {
  317. int v,w,i,j,final[20],min;
  318. for(v=0; v<g.vexnum; v++)
  319. {
  320. final[v]=0;
  321. D[v]=g.arcs[v0][v].adj;
  322. for(w=0; w<g.vexnum; w++)
  323. P[v][w]=-1;
  324. if(D[v]<INFINITY)
  325. {
  326. P[v][0]=v0;
  327. P[v][1]=v;
  328. }
  329. }
  330. D[v0]=0;
  331. final[v0]=1;
  332. for(i=1; i<g.vexnum; i++)
  333. {
  334. min=INFINITY;
  335. for(w=0; w<g.vexnum; w++)
  336. if(!final[w]&&D[w]<min)
  337. {
  338. v=w;
  339. min=D[w];
  340. }
  341. final[v]=1;
  342. for(w=0; w<g.vexnum; w++)
  343. if(!final[w]&&(min+g.arcs[v][w].adj<D[w]))
  344. {
  345. D[w]=min+g.arcs[v][w].adj;
  346. for(j=0; j<g.vexnum; j++)
  347. {
  348. P[w][j]=P[v][j];
  349. if(P[w][j]==-1)///在p[w][]第一个等于-1的地方加上顶点w
  350. {
  351. P[w][j]=w;
  352. break;
  353. }
  354. }
  355. }
  356. }
  357. }
  358. void ShortestPath_FLOYD(MGraph g, int P[20][20][20], int D[][20])
  359. {
  360. int u,v,w,i,j;
  361. for(v=0; v<g.vexnum; v++)
  362. for(w=0; w<g.vexnum; w++)
  363. {
  364. D[v][w]=g.arcs[v][w].adj;
  365. for(u=0; u<g.vexnum; u++)
  366. P[v][w][u]=-1;
  367. if(D[v][w]<INFINITY)
  368. {
  369. P[v][w][0]=v;
  370. P[v][w][1]=w;
  371. }
  372. }
  373. for(u=0; u<g.vexnum; u++)
  374. for(v=0; v<g.vexnum; v++)
  375. for(w=0; w<g.vexnum; w++)
  376. if(D[v][u]<INFINITY&&D[u][w]<INFINITY&&D[v][u]+D[u][w]<D[v][w])
  377. {
  378. ///更新D
  379. D[v][w]=D[v][u]+D[u][w];
  380. ///更新p,从v到w的路径是从v到u,再从u到w的所有路径
  381. for(i=0; i<g.vexnum; i++)
  382. {
  383. if(P[v][u][i]!=-1)
  384. P[v][w][i]=P[v][u][i];
  385. else
  386. break;
  387. }
  388. for(j=1; j<g.vexnum; j++) ///注意:这里j从1开始而不是从0开始,因为从v到u的路径最后一个顶点是u, 而从u到w的路径第一个顶点是u,只需打印u一次即可。
  389. {
  390. if(P[u][w][j]!=-1)
  391. P[v][w][i++]=P[u][w][j];
  392. else
  393. break;
  394. }
  395. }
  396. }
  397. void update(MGraph &g)
  398. {
  399. int i;
  400. printf("请输入你想查找的地点的序号:");
  401. scanf("%d",&i);
  402. if(i>=1&&i<=11)
  403. {
  404. printf("请输入新的地点名称:");
  405. scanf("%s",g.vex[i-1].name);
  406. printf("请输入新的地点名称简介:");
  407. scanf("%s",g.vex[i-1].introduce);
  408. }
  409. else printf("没有找到这个地方嘤嘤嘤qwq~\n");
  410. }
  411. void add_arc(MGraph &g)
  412. {
  413. int v1,v2,n;
  414. printf("请输入你想增加的边两端的顶点序号:");
  415. printf("请输入第一个顶点号:");
  416. scanf("%d",&v1);
  417. printf("请输入第二个顶点号:");
  418. scanf("%d",&v2);
  419. if(g.arcs[v1-1][v2-1].adj==INFINITY)
  420. {
  421. printf("请输入两点之间的距离:");
  422. scanf("%d",&g.arcs[v1-1][v2-1].adj);
  423. g.arcs[v2-1][v1-1].adj=g.arcs[v1-1][v2-1].adj;
  424. printf("增加成功!嘤嘤嘤^_^\n");
  425. }
  426. else
  427. {
  428. LL0:
  429. printf("这两点已经有路径存在了,你想要修改它吗?想的话请按1,不想请按2:\n");
  430. scanf("%d",&n);
  431. if(n==1)
  432. {
  433. printf("请输入两点之间的新的距离:");
  434. scanf("%d",&g.arcs[v1-1][v2-1].adj);
  435. g.arcs[v2-1][v1-1].adj=g.arcs[v1-1][v2-1].adj;
  436. printf("修改成功!嘤嘤嘤^-^\n");
  437. }
  438. else if(n==2)
  439. {
  440. printf("增加失败,嘤嘤嘤T_T\n");
  441. }
  442. else
  443. {
  444. printf("你的输入有误,请重新输入!嘤嘤嘤qwq\n");
  445. goto LL0;
  446. }
  447. }
  448. }
  449. void delete_arc(MGraph &g)
  450. {
  451. int v1,v2;
  452. printf("请输入你想删除的边两端的顶点序号:\n");
  453. printf("请输入第一个顶点号:\n");
  454. scanf("%d",&v1);
  455. printf("请输入第二个顶点号:\n");
  456. scanf("%d",&v2);
  457. if(g.arcs[v1-1][v2-1].adj!=INFINITY)
  458. {
  459. g.arcs[v1-1][v2-1].adj=g.arcs[v2-1][v1-1].adj=INFINITY;
  460. printf("删除成功!嘤嘤嘤^_^\n");
  461. }
  462. else
  463. printf("删除失败!这两个点之间本来就没有直接通路,你还删它干嘛?!嘤嘤嘤qwq\n");
  464. }
  465. void display_num(MGraph g)
  466. {
  467. int i;
  468. printf("<地点序号> <地点名称>\n");
  469. for(i=0; i<g.vexnum; i++)
  470. printf("%5d %s\n",g.vex[i].num,g.vex[i].name);
  471. }
  472. void display_all(MGraph g)
  473. {
  474. int i;
  475. printf("<地点序号> <地点名称> <地点简介>\n");
  476. for(i=0; i<g.vexnum; i++)
  477. {
  478. printf("%5d %s %s\n",g.vex[i].num,g.vex[i].name,g.vex[i].introduce);
  479. }
  480. }