dijkstra的封装模版
/** - swj -
*
/>_____フ
| _ _|
/`ミ _x ノ
/ |
/ ヽ ?
/ ̄| | | |
| ( ̄ヽ__ヽ_)_)
\二つ
**/
#include <bits/stdc++.h>
using namespace std;
using i64=long long;
struct DIJ{
using i64=long long;
using pii=pair<i64,i64>;
vector<i64>dis;//存点到点的最小距离
vector<vector<pii> >G;//存起点和终点的编号,边权
DIJ() {}//防止默认状态报错,类似vector<int>a,
//为dijkstra初始化
DIJ(int n)
{
dis.assign(n+1,1e18);//把所有元素设置为1e18
G.resize(n+1);//把G的大小设置为n+1
}
void add(int u,int v,int w){
G[u].emplace_back(v,w);//u v为点,w为边权
}
//堆优化版的dijkstra
void dijkstra(int s) {
priority_queue<pii> que;
dis[s] = 0;
que.push({0, s});
while (!que.empty()) {
auto p = que.top();
que.pop();
int u = p.second;
if (dis[u] < p.first) continue;
for (auto [v, w] : G[u]) {
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
que.push({ -dis[v], v});
}
}
}
}
};
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
int n,m;
cin>>n>>m;//点和边数
//初始化
DIJ dij(n);//只找一个点这样初始化,多个点建vector<DIJ>dij
//如果你只开了n的大小就会段错误,题目数据v w可能大于n
for(int i=0;i<m;i++)
{
int u,v,w;
cin>>u>>v>>w;
dij.add(u,v,w);
dij.add(v,u,w);
}
dij.dijkstra(1);
int q; cin>>q;
while(q--)
{
int u,v; cin>>u>>v;
//输出题目要求的东西
}
}
posted on 2024-08-02 19:33 swj2529411658 阅读(13) 评论(0) 编辑 收藏 举报