7654321. 22 KB

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