不使用stl容器实现上述代码
时间: 2024-02-12 20:05:58 浏览: 84
好的,以下是不使用 STL 容器实现的堆优化 Dijkstra 算法的代码:
```
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1000010;
int n, m, s, t;
bool st[N];
int h[N], e[N], w[N], ne[N], idx;
int d[N];
struct Node
{
int d, u;
bool operator< (const Node& t) const
{
return d > t.d;
}
};
void add(int u, int v, int weight)
{
e[idx] = v, w[idx] = weight, ne[idx] = h[u], h[u] = idx ++;
}
int dijkstra()
{
memset(d, 0x3f, sizeof d);
d[s] = 0;
priority_queue<Node> q;
q.push({0, s});
while (q.size())
{
auto t = q.top();
q.pop();
int u = t.u;
if (st[u]) continue;
st[u] = true;
for (int j = h[u]; j != -1; j = ne[j])
{
int k = e[j];
if (d[k] > d[u] + w[j])
{
d[k] = d[u] + w[j];
if (!st[k]) q.push({d[k], k});
}
}
}
return d[t];
}
int main()
{
scanf("%d%d%d%d", &n, &m, &s, &t);
memset(h, -1, sizeof h);
while (m -- )
{
int u, v, weight;
scanf("%d%d%d", &u, &v, &weight);
add(u, v, weight);
add(v, u, weight);
}
printf("%d\n", dijkstra());
return 0;
}
```
需要注意的是,由于我们没有使用 STL 容器,需要手动定义一个 `Node` 结构体,重载小于号运算符,以便在优先队列中进行排序。
阅读全文