这才是正确的prim算法!
真正的prim,根本不用初始化d[]数组
并且没有所谓的松弛操作
恕我直言,网上的代码都是冗余的
#include<iostream> #include<cstdio> #define ri register int #define u int namespace opt { inline u in() { u x(0),f(1); char s(getchar()); while(s<'0'||s>'9') { if(s=='-') f=-1; s=getchar(); } while(s>='0'&&s<='9') { x=(x<<1)+(x<<3)+s-'0'; s=getchar(); } return x*f; } } using opt::in; #define NN 200005 #include<cstring> #include<algorithm> #include<cmath> #include<queue> namespace mainstay { u N,M,S,cnt,mxd,d[NN],h[NN]; struct node{ u to,next,va; }a[NN<<1]; inline void add(const u &x,const u &y,const u &v){ a[++cnt].next=h[x],a[cnt].to=y,a[cnt].va=v,h[x]=cnt; } typedef std::pair<u,u> p; std::priority_queue<p,std::vector<p>,std::greater<p> > q; u vt[NN]; inline void solve() { N=in(),M=in(),S=in(); for(ri i(1);i<=M;++i){ u _a(in()),_b(in()),_c(in()); add(_a,_b,_c); } for(ri i(h[S]);i;i=a[i].next){ u _y(a[i].to); q.push(p(a[i].va,_y)); } vt[S]=1,d[S]=0; while(!q.empty()){ u _x(q.top().second),_v(q.top().first); q.pop(); if(vt[_x]) continue; vt[_x]=1,d[_x]=_v; for(ri i(h[_x]);i;i=a[i].next){ u _y(a[i].to); if(!vt[_y]) q.push(p(d[_x]+a[i].va,_y)); } } for(ri i(1);i<=N;++i) printf("%d ",d[i]); } } int main() { //freopen("x.txt","r",stdin); mainstay::solve(); }