用数据结构c++写
时间: 2023-07-04 22:27:13 浏览: 51
好的,下面我给您提供C++代码实现:
首先,我们需要定义景点的结构体,包括代号、名称、简介等属性:
```c++
struct Site {
string id; // 代号
string name; // 名称
string intro; // 简介
};
```
然后,我们需要定义边的结构体,包括路径长度等属性:
```c++
struct Edge {
int length; // 路径长度
};
```
接着,我们需要定义图的类,包括邻接表、顶点数和边数等属性:
```c++
class Graph {
public:
Graph(int n); // 构造函数,n为顶点数
void addSite(int idx, string id, string name, string intro); // 添加顶点
void addEdge(int u, int v, int length); // 添加边
Site getSite(int idx); // 查询顶点信息
int getShortestPath(int u, int v, vector<Site>& path); // 查询最短路径
private:
vector<vector<pair<int, Edge>>> adjList; // 邻接表
int n; // 顶点数
int m; // 边数
};
```
其中,adjList是邻接表,n是顶点数,m是边数。addSite用于添加顶点,addEdge用于添加边,getSite用于查询顶点信息,getShortestPath用于查询最短路径,并返回路径上的景点信息。
下面是Graph类的实现:
```c++
Graph::Graph(int n) {
this->n = n;
this->m = 0;
adjList.resize(n);
}
void Graph::addSite(int idx, string id, string name, string intro) {
Site site = {id, name, intro};
adjList[idx].push_back(make_pair(idx, Edge()));
}
void Graph::addEdge(int u, int v, int length) {
Edge edge = {length};
adjList[u].push_back(make_pair(v, edge));
adjList[v].push_back(make_pair(u, edge)); // 如果是无向图,则需要添加反向边
m++;
}
Site Graph::getSite(int idx) {
return adjList[idx][0].first;
}
int Graph::getShortestPath(int u, int v, vector<Site>& path) {
vector<int> dist(n, INT_MAX); // 到各个顶点的距离
vector<bool> visited(n, false); // 是否已经访问
vector<int> prev(n, -1); // 记录路径
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // 小根堆
dist[u] = 0;
pq.push(make_pair(0, u));
while (!pq.empty()) {
auto top = pq.top();
pq.pop();
int curr = top.second;
if (visited[curr]) continue;
visited[curr] = true;
for (auto& p : adjList[curr]) {
int next = p.first;
int length = p.second.length;
if (dist[next] > dist[curr] + length) {
dist[next] = dist[curr] + length;
prev[next] = curr;
pq.push(make_pair(dist[next], next));
}
}
}
if (prev[v] == -1) return -1; // 无法到达
int curr = v;
while (curr != -1) {
path.push_back(getSite(curr));
curr = prev[curr];
}
reverse(path.begin(), path.end());
return dist[v];
}
```
其中,getShortestPath使用了 Dijkstra 算法,使用小根堆进行优化。最终,我们就可以通过Graph类来实现校园平面图的存储、查询和最短路径计算等功能了!