迪杰斯特拉算法求最短路径问题

题目要求

实验项目名称:图及其应用

一、实验目的:

1)掌握图的常用存储结构;

2)掌握图的遍历操作;

3)应用图结构解决具体问题

二、实验题目:

  编写一个校园导游程序,为来访的客人提供各种信息查询服务。   主要功能:   1) 设计学校的校园平面图,所含景点不少于10个:顶点表示景点,边表示路径等。   2)为客人提供图中任意景点相关信息的查询   3)为客人提供图中任意景点的问路查询,即查询人以景点间的一条最短路径。   要求:   

(1) 设计一个主界面

(2) 设计功能菜单,供用户选择

(3) 有一定的实用性。

 

 

程序代码

.h

#pragma once
#include<string>
#include<iostream>
using namespace std;
#include<fstream>
#include<iomanip>
class MinWay
{
int point[10][10];
string name[10];
int begin;
int finish;

public:
MinWay(void);
~MinWay(void);
bool getPoint(); //得到点
void show(); //显示所有姓名
void minway(); //得到最小路径
};

.cpp

#include "MinWay.h"


MinWay::MinWay(void)
{
fstream infile("data.txt",ios::in);
//点集的读入
if(!infile)
cout<<"the file is not find,please creat the file"<<endl;
else
{for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
infile>>point[i][j];
for(int i=0;i<10;i++)
infile>>name[i];
}
infile.close();
//其他值进行初始化
begin=-1;
finish=-1;
}


MinWay::~MinWay(void)
{

}
void MinWay::show()
{
for(int i=0;i<10;i++)
cout<<name[i]<<" ";
}
bool MinWay::getPoint(){
cout << "全部景点信息为\n";
for (int i = 0; i < 10; i++) {
cout << i + 1 << "、" << name[i] << "\n";
}
cout << "输入景点对应的数字作为选择\n";
cout << "输入起点信息\n";
cin >> begin;
begin--;
if (begin < 0 || begin>9)
return false;
cout << "输入终点信息\n";
cin >> finish;
finish--;
if (finish < 0 || finish>9)
return false;
return true;
}
void MinWay::minway(){
int headpath[10];
int minlong=666;
int minpoint=begin;
int longs[10];
bool judge[10];
if(finish<0||begin<0){
cout<<"输入错误\n"<<endl;
return;
}

//进行初始化
for(int i=0;i<10;i++){
longs[i]=point[begin][i];
judge[i]=false;
headpath[i] = begin;
}
headpath[begin]=-1;
judge[begin]=true; //起点加入判断数组
longs[begin]=0; //起点到起点的距离设置为0
//得到当前最短长度
for (int k = 1; k < 10; k++) {
minlong = 666;
for (int i = 0; i < 10; i++) {
if (!judge[i] && longs[i] < minlong)
{
minlong = longs[i];
minpoint = i;
}
}
//刷新
judge[minpoint] = true;
longs[minpoint] = longs[headpath[minpoint]] + minlong;
if (minpoint == finish) //找到最短路径跳出循环
break;

//更新最小长度 longs数组
for (int i = 0; i < 10; i++) {
if (!judge[i]) {
int flag = 666;
int headpoint = -1;
//在为加入成功点集中选取最小的距离
for (int j = 0; j < 10; j++) {
if (judge[j] && point[i][j] < flag)
{
flag = point[i][j];
headpoint = j;
}
}
headpath[i] = headpoint;
longs[i] = flag;
}
}
}

int head;
head = headpath[finish];
string namepath[10];
int pathNum = 0;
namepath[pathNum++] = name[finish];
while (true) {
if (head<0)
break;
namepath[pathNum++] = name[head];
head = headpath[head];
}
if (namepath[pathNum-1] != name[begin]) {
cout << "未找到路径\n";
}
else {
cout << "最短路径为\n";
for (int i = pathNum-1; i >= 0; i--) {
cout << namepath[i] << "-->";
}
}
cout <<"\n长短为 " << longs[finish]<<endl;
}

main

 

#include"MinWay.h"
void main()
{
MinWay test;
while (true)
{
cout << "请选择功能\n";
cout << "1、查找最短路径\n";
cout << "2、查看全部景点\n";
cout << "3、退出\n";
int choice;
cin >> choice;
if (choice==1)
{
while (!test.getPoint()) {
cout << "输入错误,从新输入\n";
}
test.minway();
}
else if (choice==2) {
test.show();
}
else {
break;
}

 

}
}

 

posted @ 2016-12-10 09:28  runningboys  阅读(1632)  评论(0编辑  收藏  举报