POJ

来源:互联网 发布:怎么用c语言玩单片机 编辑:程序博客网 时间:2024/06/14 20:49

题目链接:http://poj.org/problem?id=1287

题意:给你点边距离求最小生成树

思路:完全的一个模板题


代码:

#include <cstdio>#include <cmath>#include <iostream>#include <cstring>#include <algorithm>#include <queue>#include <stack>#include <vector>#include <map>#include <numeric>#include <set>#include <string>#include <cctype>#include <sstream>#define INF 0x3f3f3f3fusing namespace std;typedef long long LL;typedef pair<int, int> P;const int maxn = 5e5 + 5;int n,m,p[55];struct edge{    int u,v,cost;}e[maxn];bool cmp(edge a,edge b){    return a.cost<b.cost;}void init (int n) {for (int i=1;i<=n;i++) p[i]=i;}int Find(int x) {return p[x]==x?x: ( p[x]=Find ( p[x] ) );}bool same(int a,int b) {return Find(a)==Find(b);}void unite (int x,int y){    x=Find(x);    y=Find(y);    if (x!=y)  p[x]=y;}int kruskal(){    sort(e,e+m,cmp);    init(n);    int ans=0;    for (int i=0;i<m;i++){        edge ee=e[i];        if (!same(ee.u,ee.v)){            unite(ee.u,ee.v);            ans+=ee.cost;        }    }    return ans;}int main () {    //freopen ("in.txt", "r", stdin);    while (~scanf ("%d%d",&n,&m)&&n){        memset(e,0,sizeof(e));        for (int i=0;i<m;i++){            int u,v,c;            scanf ("%d%d%d",&u,&v,&c);            e[i].u=u;            e[i].v=v;            e[i].cost=c;        }        printf ("%d\n",kruskal());    }    return 0;}