迪杰斯特拉堆优化

来源:互联网 发布:ubuntu登陆界面鼠标 编辑:程序博客网 时间:2024/05/16 08:06

https://www.luogu.org/problem/show?pid=3371

看着和spfa可像了

#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <bits/stdc++.h>#include <queue>using namespace std;const int INF=2147483647;int n,m,ss;vector< pair<int ,int > > d[100005];struct node{    friend bool operator<(node a,node b)    {        return a.y>b.y;    }    int x,y;} s[100005];int disk(int x){    priority_queue<node> dp;    for(int i=0;i<=n;i++)    {        s[i].y=INF;        s[i].x=i;    }    s[x].y=0;    dp.push(s[x]);    while(dp.size())    {        x=dp.top().x; dp.pop();        int l=s[x].y;        int xe,ye;        //cout<<d[x].size()<<' '<<x<<endl;        for(int i=0;i<d[x].size();i++)        {            xe=d[x][i].first;            ye=d[x][i].second;            if(s[xe].y>l+ye)            {                s[xe].y=l+ye;               // cout<<s[xe].y<<' '<<xe<<' '<<ye<<endl;                dp.push(s[xe]);            }        }    }    for(int i=1;i<=n;i++)    {        if(i-1) cout<<" ";        cout<<s[i].y;    }    cout<<endl;}int main(){    scanf("%d%d%d",&n,&m,&ss);    int x,y,z;    for(int i=0;i<m;i++)    {        scanf("%d%d%d",&x,&y,&z);        d[x].push_back(make_pair(y,z));    }    disk(ss);}
原创粉丝点击