掌握图的存储方法和最短路经算法。
设计一个校园导游程序,为来访客人提供各种信息查询服务。测试数据根据实际情况指定。提示:一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向图。顶点和边均含有相关信息。
为了能够更好的展现学校的信息,表示学校内部各个景点的信息和路径信息。我设计了一个校内咨询网页,这个网页内部包括学校的地图,12个景点的信息,还有每两个景点之间的最短路径。
输出信息
信息存储
我们的信息存储主要有两个部分:景点信息和路径信息。
最短路径的算法
由于本次设计需要用户输入起点和终点,也是就是说需要求任意两点之间的最短路径。所以我们使用Floyd算法来求任意两点之间的最短路径。
为了侧重重点,我在实验报告里不再展示网页设计相关的代码,只展示算法的代码部分。
邻接矩阵
static int inf = 0x3f3f3f;
public int[,] Arr = new int[12, 12] {
{
0, inf,inf,inf,inf,inf, 1,inf,inf,inf,inf,inf },
{
inf, 0, 1 ,inf,inf,inf, 1,inf,inf,inf,inf,inf },
{
inf, 1,0 , 5 ,inf, 3, inf,inf,inf,inf,inf,inf },
{
inf,inf,5,0,inf,inf, inf,inf,inf,inf,12,inf },
{
inf, inf,inf,inf,0,inf, inf,inf,inf,inf,2,2 },
{
inf, inf,3,inf,inf,0, inf,inf,inf,2,inf,inf },
{
1, 1,inf,inf,inf,inf, 0, 1,inf,inf,inf,inf },
{
inf, inf,inf,inf,inf,inf, 1,0,1,2,inf,inf },
{
inf, inf,inf,inf,inf,inf, inf,1,0,inf,1,2 },
{
inf, inf,inf,inf,inf,2, inf,2,inf,0,2,inf },
{
inf, inf,inf,inf,2,inf, inf,inf,1,2,0,3 },
{
inf, inf,inf,inf,inf,inf, inf,inf,2,inf,3,0 },
};
路径保存
我们用一个-1的矩阵来保存路径
public int[,] path = new int[12, 12] {
{
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
{
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
{
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
{
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
{
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
{
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
{
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
{
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
{
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
{
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
{
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
{
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
};
最短路算法
采用Floyd算法
public void Shortest()
{
for (int k = 0; k < 12; k++)
for (int i = 0; i < 12; i++)
for (int j = 0; j < 12; j++)
if(Arr[i, j] > Arr[i, k] + Arr[k, j])
{
Arr[i, j] = Arr[i, k] + Arr[k, j];
path[i, j] = k;
}
string p = DropDownList1.SelectedValue.ToString();
string[]p1 = p.Split('-');
string q = DropDownList2.SelectedValue.ToString();
string[] q1 = q.Split('-');
int pp = int.Parse(p1[0]);
int qq = int.Parse(q1[0]);
if(Arr[pp,qq]!=inf)
{
label1.Text = "";
label1.Text += p1[0] + p1[1] + "->";
print(pp, qq);
label1.Text += q1[0] + q1[1];
}
label2.Text = DropDownList1.SelectedItem.Text + "->" + DropDownList2.SelectedItem.Text + "的最短路径是" + Arr[pp, qq];
}
路径输出
public void print(int a, int b)
{
if (path[a,b] == -1) return;//因为开始初始化为-1,这里就可以避免相邻的再次输出
print(a, path[a,b]);//前半部
//cout << path[a,b] << "-->";//输出该点
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath("~/App_Data/cons.xml"));
XmlNode xn = doc.SelectSingleNode("Constellation");
XmlNodeList xnl = xn.ChildNodes;
// 遍历子节点
foreach (XmlNode xnd in xnl)
{
// 运用实体类保存信息
ConsModel cm = new ConsModel();
XmlElement xe = (XmlElement)xnd;
XmlNodeList xnl0 = xe.ChildNodes;
cm.ConsNum = xnl0.Item(0).InnerText;
cm.ConsName = xnl0.Item(1).InnerText;
if(path[a,b].ToString()==cm.ConsNum)
{
label1.Text += path[a, b] + cm.ConsName+"->";
break;
}
}
print(path[a,b], b);//后半部
}
问题及解决办法
网页设计遇到的问题和解决办法
遇到最大的问题就是我本人对于前端设计不算了解,不能实现较为复杂的页面。我在调控一些网页控件时也遇到了对功能不了解而出现的错误。
我的解决办法就是尽可能简化网页设计部分,用最少的控件解决问题。
算法遇到的问题和解决办法
算法遇到的最大的问题就是路径的输出。根据Floyd算法,可以很简单的求出每两个点之间的最短路径。但是输出是个问题。
经过一番思考,我在求解最短路径的时候记录下节点的信息,然后在求解的时候用递归输出。
算法的时空分析
通过这个实验我有以下体会