//MainWidget.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "mapwidget.h"
#include <QToolButton>
#include <QGraphicsLineItem>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QLabel>
#include <QComboBox>
#include <QSpinBox>
#include <QTextEdit>
#include <QPainter>
#include <QVector>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
void createToolBar();
void paintEvent (QPaintEvent *);
void setStart(int X, int Y);
void setEnd(int X, int Y);
void setNextPos (int index);
void initScene();
public slots:
void setStartStation();
void setEndStation();
void FindPath();
void Clear();
private:
MapWidget *mapWidget;
QLabel *startLabel;
QLabel *endLabel;
QComboBox *startComboBox;
QComboBox *endComboBox;
QToolButton *findPathBtn;
QToolButton *clearBtn;
QGraphicsScene *scene;
QGraphicsView *view;
int startX, startY, endX, endY;
QVector<int> nextPath;
struct ArcCell{ //弧信息
int adj; //对无权图有1,0表示是否相邻,对带权图,则为权值类型
// string info; //该弧的相关信息
};
//内部类
static const int MAX_VERTEX_NUM = 31;
static const int INF = 999999;
struct MGraph{
QVector<int> vexs; //顶点集合
//临接矩阵
ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum; //顶点数
int arcnum; //边数
// int kind; //图的类型
};
class DijkstraFindPath
{
public:
DijkstraFindPath();
MGraph mgraph;
void CreateGraph();
// void ShortestPath(int v0, PathMatrix &path, ShortPathTable &DP, int prev[]);
int prev[MAX_VERTEX_NUM]; //最短路上的前驱顶点
int d[MAX_VERTEX_NUM]; //表示边e = (u,v)的权值(不存在时为INF,不过d[i][i]=0)
bool used[MAX_VERTEX_NUM]; //已经使用过的图
void dijkstra(int startPos); //求从起点startPos出发到各个顶点的最短距离
QVector<int> get_Path(int endPos);//到顶点endPos的最短路
};
DijkstraFindPath *dj;
};
#endif // MAINWINDOW_H
//MainWidget.cpp
//最短路径算法,和界面的实现
#include "mainwindow.h"
#include <qdebug.h>
#include <QToolBar>
#include <QtAlgorithms>
#include <iostream>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// mapWidget = new MapWidget;
// painter = new QPainter();
dj = new MainWindow::DijkstraFindPath();
dj->CreateGraph ();
scene = new QGraphicsScene;
scene->setSceneRect (-100, -100, 700, 700);
initScene();
view = new QGraphicsView;
view->setScene (scene);
view->setMinimumSize (800, 800);
view->show ();
setCentralWidget (view);
createToolBar (); //实现一个工具栏
// setCentralWidget (mapWidget);
// setMinimumSize (600, 400); //设置最小尺寸
}
MainWindow::DijkstraFindPath::DijkstraFindPath()
{
mgraph.vexnum = 31; //初始化点数目
for (int i = 0; i < mgraph.vexnum; i++) //初始化点编号
mgraph.vexs.push_back (i);
mgraph.arcnum = 80; //暂定
for (int i = 0; i < mgraph.vexnum; i++) {
for (int j = 0; j < mgraph.vexnum; j++) {
if (i == j)
mgraph.arcs[i][j].adj = 0;
else
mgraph.arcs[i][j].adj = INF;
// mgraph.arcs[i][j].info = "";
}
}
}
void MainWindow::DijkstraFindPath::CreateGraph ()
{
mgraph.arcs[0][1].adj = mgraph.arcs[1][0].adj = 45; //6 - 5
mgraph.arcs[0][6].adj = mgr
标签:QT,int,void,校园,mgraph,DijkstraFindPath,include,导航,MainWindow
From: https://blog.csdn.net/booming2/article/details/142909014