求助,800分
查看原帖
求助,800分
304524
崔化博楼主2021/7/23 19:10
#include <queue>
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
inline long long read(){
    long long x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
inline void write(long long x)
{
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9) 
        write(x/10);
    putchar(x%10+'0');
}
struct node {
    long long id,p;
    bool operator <(const node &a) const {
        return p>a.p;
    }
};
priority_queue<node> q;
vector<node> a[300007];
long long n,m,s,dis[300007],vis[300007];
void dijie(long long k) {
    memset(dis,0x3f,sizeof(dis));
    dis[k]=0;
    //vis[k]=1;
    q.push((node) {
        k,0
    });
    while(!q.empty()) {
        node o=q.top();
        q.pop();
        if(vis[o.id])
            continue;
        vis[o.id]=1;
        for(long long i=0; i<a[o.id].size(); ++i) {
            node l=a[o.id][i];
            if(vis[l.id]==0&&dis[l.id]>dis[o.id]+l.p) {
                dis[l.id]=dis[o.id]+l.p;
                q.push((node) {
                    l.id,dis[l.id]
                });
            }
        }
    }
}
int main() {
    n=read();
    m=read();
    for(long long i=1; i<=m; ++i) {
        long long u,v,w;
        u=read();
        a[u].push_back((node) {
            read(),read()
        });
    }
    dijie(1);
    for(long long i=1; i<=n; ++i) {
        if(dis[i]==0x3f3f3f3f3f3f3f3f)
            write(-1),printf(" ");
        else
            write(dis[i]),printf(" ");
    }
    return 0;
}
2021/7/23 19:10
加载中...