Dijikstra+Heap

#include<cstdio>
#include<queue>
#include<vector>
#include<cctype>
#include<cstring>
#define N 100010
#define rint register int 
#define inf 2147483647
using namespace std;
struct edge{
    int num,val;
    bool operator <(const edge &x) const{
        return val>x.val;
    }
};
priority_queue<edge> q;
vector <pair<int,int > >e[N];
int n,m,s,dis[N];
bool vis[N];
inline int read()
{
    int f=0,x=0;
    char ch=getchar();
    while(!isdigit(ch)) f|=(ch=='-'),ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return f?-x:x;
}
inline void dij(int s){
    while(!q.empty()){
        int u=q.top().num;
        q.pop();
        if(!vis[u]){
            vis[u]=true;
            for(rint i=0;i<e[u].size();++i){
                int v=e[u][i].first;
                if(!vis[v]&&dis[v]>dis[u]+e[u][i].second){
                    dis[v]=dis[u]+e[u][i].second;
                    q.push((edge){v,dis[v]});
                }
            }
        }
    }
}
int main(){
    n=read();m=read();s=read();
    for(rint i=1;i<=m;++i){
        int u,v,w;
        u=read();v=read();w=read();
        if(u==v)    continue;
        e[u].push_back(make_pair(v,w));
    }
    for(rint i=1;i<=n;++i)  dis[i]=inf;
    dis[s]=0;
    q.push((edge){s,0});
    dij(s);
    for(rint i=1;i<=n;++i)  printf("%d ",dis[i]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/horrigue/p/9616348.html
今日推荐