我怎么让最大点数更大
时间: 2024-02-12 17:05:23 浏览: 24
如果你想让最大点数更大,可以考虑使用邻接表来存储图,这样可以有效降低空间复杂度。邻接表是由链表构成的数组,数组中的每个元素都是一个链表,存储与该点相邻的点及其边权。
具体实现方法如下:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 100000; // 最大点数
const int INF = 0x3f3f3f3f; // 无穷大
struct Edge {
int to; // 目标点
int w; // 边权
int next; // 下一个节点的下标
} edges[MAXN]; // 存储边的数组
int head[MAXN]; // 存储每个点的第一条边的下标
int cnt = 0; // 记录边的总数
int n, m; // 点数、边数
int dis[MAXN]; // 距离数组
bool vis[MAXN]; // 标记数组
void addEdge(int u, int v, int w) {
edges[cnt].to = v;
edges[cnt].w = w;
edges[cnt].next = head[u];
head[u] = cnt++;
}
void dijkstra(int start, int end) {
memset(vis, 0, sizeof(vis)); // 初始化标记数组
for (int i = 1; i <= n; ++i) {
dis[i] = INF; // 初始化距离数组
}
dis[start] = 0; // 起点到自身的距离为0
while (!vis[end]) { // 当终点未被标记时
int min_dis = INF, min_pos = -1;
for (int j = 1; j <= n; ++j) {
if (!vis[j] && dis[j] < min_dis) { // 找到距离最小的未标记点
min_dis = dis[j];
min_pos = j;
}
}
if (min_pos == -1) return; // 所有点均不连通
vis[min_pos] = true; // 标记该点
for (int k = head[min_pos]; k != -1; k = edges[k].next) {
int j = edges[k].to;
if (!vis[j] && dis[j] > dis[min_pos] + edges[k].w) { // 更新距离数组
dis[j] = dis[min_pos] + edges[k].w;
}
}
}
}
int main() {
memset(head, -1, sizeof(head)); // 初始化邻接表
cin >> n >> m;
for (int i = 1; i <= m; ++i) {
int u, v, w;
cin >> u >> v >> w;
addEdge(u, v, w);
addEdge(v, u, w); // 无向图
}
int start, end;
cin >> start >> end;
dijkstra(start, end);
cout << dis[end] << endl; // 输出起点到终点的最短距离
return 0;
}
```
在上述代码中,addEdge函数用于将一条边加入邻接表,head数组存储每个点的第一条边的下标,cnt记录边的总数。dijkstra函数中,k表示从当前点min_pos出发的边的下标,j表示该边的目标点,通过head和edges数组可以找到该边的边权edges[k].w。