最短路dijkstra演算法

橙子小滿發表於2020-11-11

一直想著把這個板子存一下,但老是忘了,結果每次還得自己手打

dijkstra最短路演算法有兩種方法   第一種n^2的時間,用一個陣列維護起點到所有點最短距離,不斷的用最新點連進來的邊來更新陣列

第二種方法是 nlogm的  用一個優先佇列來找出區域性最優解,進而擴散至全域性最優

洛谷單源最短路板子題

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+7;
typedef long long ll;
const ll inf=1e18;
int n,m,s,t;
struct node
{
    int to;
    ll w;
    bool operator<(const node &s) const
    {

        return w>s.w;
    }
};
vector<node>son[N];
ll ans[N];
void dijkstra()
{
    priority_queue<node>p;
    for(int i=1;i<=n;i++) ans[i]=inf;
    p.push({s,0});
    while(p.size())
    {
        node a=p.top();
        p.pop();
        if(a.w>=ans[a.to]) continue;
        ans[a.to]=a.w;
        
        for(int i=0;i<son[a.to].size();i++)
        {
            node d=son[a.to][i];
            if(ans[d.to]>d.w+a.w)
            p.push({d.to,d.w+a.w});
        }
    }
}
int main()
{
    //ios::sync_with_stdio(false);
   scanf("%d%d%d",&n,&m,&s);
   for(int i=1;i<=m;i++)
   {
       int a1,a2;ll a3;
       scanf("%d%d%lld",&a1,&a2,&a3);
       son[a1].push_back({a2,a3});
       //son[a2].push_back({a1,a3});
   }
   dijkstra();
   for(int i=1;i<=n;i++) printf("%lld ",ans[i]);
  // printf("%lld\n",ans[n]);
}

 

相關文章