最小生成树-prim 模板

来源:互联网 发布:搞怪软件有哪些 编辑:程序博客网 时间:2024/06/17 04:02
#include<iostream>#include<cstdio>#include<vector>#include<algorithm>#include<queue>#define ll long longusing namespace std;struct node{int to,len;node(int x,int y){to=x,len=y;}friend bool operator < (node a,node b){return a.len>b.len;}};int n,m;priority_queue<node>q;int ans=0;bool vis[1010];vector<node>v[1010];void link(int x,int y,int z){v[x].push_back(node(y,z));v[y].push_back(node(x,z));}int main(){scanf("%d%d",&n,&m);for(int i=0; i<m; i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);link(x,y,z);}vis[1]=true;for(int i=0; i<v[1].size(); i++)q.push(node(v[1][i].to,v[1][i].len));int sum=1;while(!q.empty()){node t=q.top();q.pop();if(vis[t.to])continue;sum++;ans+=t.len;vis[t.to]=true;if(sum==n)break;for(int i=0; i<v[t.to].size(); i++)if(!vis[v[t.to][i].to])q.push(node(v[t.to][i].to,v[t.to][i].len));}if(sum==n)printf("%d\n",ans);else printf("-1\n");return 0;}