Prim算法模板

来源:互联网 发布:动态规划算法的条件 编辑:程序博客网 时间:2024/05/21 03:16

Prim算法模板



#include<cmath>#include<ctime>#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<iomanip>#include<vector>#include<string>#include<bitset>#include<queue>#include<map>#include<set>using namespace std;typedef long long ll;inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}void print(int x){if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}const int N=5010,M=200100,inf=0X3f3f3f3f;int last[N],ecnt;struct EDGE{int to,nt,val;}e[M<<1];inline void add(int u,int v,int val){e[++ecnt]=(EDGE){v,last[u],val};last[u]=ecnt;}struct node{int pos,val;friend bool operator <(const node &x,const node &y){return x.val>y.val;}};priority_queue<node>q;bool vis[N];int dis[N];int main(){int n=read(),m=read();for(int i=1,u,v,val;i<=m;++i){u=read();v=read();val=read();add(u,v,val);add(v,u,val);}ll ans=0;for(int i=2;i<=n;++i)q.push((node){i,inf});q.push((node){1,0});memset(dis,0X3f,sizeof(dis));dis[1]=0;while(!q.empty()){while(!q.empty()&&vis[q.top().pos])q.pop();if(q.empty())break;int u=q.top().pos;vis[u]=1;if(dis[u]==inf){puts("orz");return 0;}ans+=dis[u];for(int i=last[u];i;i=e[i].nt)if(!vis[e[i].to]&&e[i].val<dis[e[i].to]){dis[e[i].to]=e[i].val;q.push((node){e[i].to,e[i].val});}}cout<<ans<<endl;return 0;}/*4 51 2 21 3 21 4 32 3 43 4 37*/