poj 1287 kruskal

来源:互联网 发布:手机更换网络制式硬件 编辑:程序博客网 时间:2024/05/02 22:25
#include<stdio.h>#include<algorithm>int P,R,map[600][600],pre[600];#define MX 1000010#include<string.h>using namespace std;struct point{    int s,e;    int leth;}eg[510];bool cmp(point a,point b){    return a.leth<b.leth;}int find(int w){    int now,root=w;    while(pre[root]!=root)        root=pre[root];    while(pre[w]!=root)    {        now=pre[w];        pre[w]=root;        w=now;    }    return root;}int main(){    while(scanf("%d",&P)&&P)    {        scanf("%d",&R);        memset(eg,0,sizeof(eg));        for(int i=1;i<=P;i++)            for(int j=1;j<=P;j++)                map[i][j]=MX;        for(int i=1;i<=P;i++)            pre[i]=i;        for(int i=0;i<R;i++)        {            int a,b,c;            scanf("%d%d%d",&eg[i].s,&eg[i].e,&eg[i].leth);            //scanf("%d%d%d",&a,&b,&c);            //if(map[a][b]>c)            //{            //    map[a][b]=map[b][a]=c;            //}        }        int k=0,sum=0;        /*for(int i=1;i<=P;i++)            for(int j=i;j<=P;j++)            {                if(map[i][j]<MX)                {                    eg[k].s=i;eg[k].e=j;                    eg[k++].leth=map[i][j];                }            }*/        sort(eg,eg+R,cmp);        for(int i=0;i<R;i++)        {            int x,y;            x=find(eg[i].s);            y=find(eg[i].e);            if(x!=y)            {                k++;                pre[y]=x;                sum+=eg[i].leth;            }            if(k==P-1)            {                break;            }        }        printf("%d\n",sum);    }    return 0;}


原创粉丝点击