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编辑  收藏  举报

导航