logo资料库

算法设计程序设计报告.doc

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
算法设计 程序设计报告 报告题目:实现校园里从一个地点到另一个地点的最短路径 课设题目:算法分析和设计 一. 实验目的 用贪心算法实现实现校园里从一个地点到另一个地点的最短路径 二. 实验题目和原理分析 在校园里有不少于 10 个的地方,有的两点之间有路,有的两点之间并没有路, 从中选出起点、终点,找从起点到终点的最佳路径,并输出。程序采用了 Dijkstras 算法。 三. 具体的程序设计思想
要求:设计从一个地点到另一个地点的最短路径,用 C++实现,给出程序的正 确运行结果。 设置顶点集合 S 并不断地做贪心选择来扩充这个集合。一个顶点属于集合 S 当 且仅当从源到该顶点的最短路径长度已知。初始时,S 中仅含有源。设 u 是 G 的某 一个顶点,把从源到 u 且中间只经过 S 中顶点的路径为从源到 u 的特殊路径,并用 数组 dist 记录当前每个顶点所对应的最短特殊路径长度。Dijkstras 算法每次从 V-S 中取出具有最短特殊路长度的顶点 u,将 u 添加到 S 中,同时对数组 dist 进行必要 的修改。一旦 S 包含了所有 V 中顶点,dist 就记录了从源到所有其他顶点之间的最 短路径长度。 四. 具体代码及实现 #include #include using namespace std; const float Max_Num = 12000; const int Num = 10; bool Dijkstra(int v, float (*a)[Num],float *dist, int *prev) { int h = Num; if(v < 0 || v > Num) return 0; bool s[Num]; //初始化 for(int i = 0; i < h; i++) { if(i != v) { dist[i] = a[v][i]; s[i] = false; if(dist[i] == Max_Num) prev[i] = -1; else prev[i] = v; } else { dist[v] = 0; s[v] = true; prev[v] = -1; } } //dist[v] = 0; //s[v] = true;
for(int j = 0; j < h-1; j++) { float temp = Max_Num; int u = v; for(int k = 0; k < h; k++) //找 u 到剩下点的最短 路径 件 { if((!s[k]) && (dist[k] < temp)) //s[k] == false 时满足条 { } u = k; temp = dist[k]; } s[u] = true; for(int m = 0; m < h; m++) if((!s[m]) && (a[u][m] < Max_Num)) { float newdist = dist[u]+a[u][m]; if(newdist < dist[m]) { dist[m] = newdist; prev[m] = u; } } } } int main() { string _str[Num]; float c[Num][Num]; float min = 0; float dist[Num]; int prev[Num]; int way, qu; int nn, nn1; int i, j; int sum = 9; _str[0] = "三区四栋"; _str[1] = "四食堂"; _str[2] = "六食堂"; _str[3] = "图书馆"; _str[4] = "一号楼";
_str[5] = "二号楼"; _str[6] = "主 A 楼"; _str[7] = "西门"; _str[8] = "计算机学院"; _str[9] = "前门"; for(i = 0; i>nn; while(nn!=0 && nn!=1) { cout<<"输入错误请重输:"; cin>>nn; } while(nn!=0) { sum++; cout<<"输入节点:(i j)"; int a, b; float aa; cin>>a>>b; cout<<"权值:"; cin>>aa; c[a][b] = aa; c[b][a] = aa; //cout<>nn; while(nn!=0 && nn!=1) { cout<<"输入错误请重输:";
cin>>nn; } } if(sum < (Num-1)) { cout<<" 输入错误,重新开始."; exit(1); } cout<<"输入你所在的位置及所要到的地方:"; cin>>way>>qu; Dijkstra(way, c, dist, prev); nn1 = qu; min = dist[nn1]; cout<<"==================================================\n"; cout<<"你要查询从"<<_str[way]<<"到"<<_str[qu]<<"\n"; if(nn1!=way) { cout<<_str[nn1]; while(nn1!=way) { //prev[way] == -1 cout<<"<-"<<_str[prev[nn1]]; nn1 = prev[nn1]; } cout<<"\n 所需走"<
} while(1); return 1; }
五. 实验总结 通过这次实验,了解到了选择算法的重要性,算法就像一个工具,它可以帮助我快速的 解决问题。通过实践更加深了对上课所学知识的领会,能够灵活运用书本中的知识。不过同 时暴露出了很多的问题,但我在今后的学习中会改进的。
分享到:
收藏