HLGOJ 1101 Bombs of HRBUST(kruskal)

来源:互联网 发布:剑灵卡刀软件 编辑:程序博客网 时间:2024/06/05 16:14

简单的最小生成树问题,题目给出的是一个矩阵,用prim就直接用读的数组,用kruskal就直接读取列下标大于行下标的数然后存边排序,就可以得到最小生成树了。


代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define maxn 100struct Edge{    int from, to, data;};Edge edges[maxn*maxn/2];bool cmp(const Edge a, const Edge b){    return a.data<b.data;}int p[maxn+10];int fa(int x){    return p[x]==x? x : p[x] = fa(p[x]);}int main(){    int t;    scanf("%d", &t);    while(t--)    {        int n, tmp;        scanf("%d", &n);        int cnt = 0;        for(int i = 0; i <= n; i++) p[i] = i;        for(int i = 1; i <= n; i++)        {            for(int j = 1; j <= n; j++)            {                scanf("%d", &tmp);                if(j > i)                {                    edges[cnt].from = i;                    edges[cnt].to = j;                    edges[cnt++].data = tmp;                }            }        }        sort(edges, edges + cnt, cmp);        //for(int i = 0; i<cnt; i++)        {           // printf("->%d\n", edges[i].data);        }        int ans = 0;        int cnt1 = 1;        for(int i = 0; i < cnt; i++)        {            int x = fa(edges[i].from);            int y = fa(edges[i].to);            if(x!=y)            {                ans += edges[i].data;                p[x] = y;                cnt1++;            }            if(cnt1==n) break;        }        printf("%d\n", ans);    }    return 0;}


0 0
原创粉丝点击