并查集+最小生成树_HDU_1102

来源:互联网 发布:网络装备交易排行榜 编辑:程序博客网 时间:2024/05/17 03:20

水一发

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>const int maxn = 105;using namespace std;struct node{    int u,v,val;};int cmp(node a, node b){    return a.val < b.val;}node e[maxn*maxn];int n,par[maxn],rot[maxn];void Init(){    for(int i = 0; i < maxn; i++)    {        par[i] = i;        rot[i] = 0;    }}int Find(int x){    if(x == par[x])        return x;    par[x] = Find(par[x]);    return par[x];}int Union(int x, int y){    x = Find(x);    y = Find(y);    if(x == y)return 0;    if(rot[x] > rot[y])    {        par[y] = x;    }    else    {        par[x] = y;        rot[y]++;    }    return 1;}int main(){    int t,x,q,u,v;    while(scanf("%d",&n) != EOF)    {        t = 0;        Init();        for(int i = 1; i <= n; i++)        {            for(int j = 1; j <= n; j++)            {                scanf("%d",&x);                if(i > j)                {                    e[t].u = i;                    e[t].v = j;                    e[t++].val = x;                }            }        }        scanf("%d",&q);        while(q--)        {            scanf("%d%d",&u,&v);            Union(u,v);        }        sort(e,e+t,cmp);        int ans = 0;        for(int i = 0; i < t; i++)        {            //printf("%d %d %d\n",e[i].u,e[i].v,e[i].val);            if(Union(e[i].u, e[i].v))                ans+=e[i].val;        }        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击