首页 > 其他 > 详细

洛谷P1550打井

时间:2019-01-05 22:03:24      阅读:139      评论:0      收藏:0      [点我收藏+]

打井

题目

该题是一个最小生成树的好题,但是比起一般的最小生成树来说他不仅仅有各个井相连,而且还要和地下水相连,所以地下水我们也可以看成一口井。

代码

#include <bits/stdc++.h>
using namespace std;
struct edge {
    int a, b, c;
}e[100100];
bool cmp(const edge &a, const edge &b)
{
    return a.c < b.c;
}
int cnt, fa[100100], vis[1000][1000], ans;int n, m;
int find(int a)
{
    if (fa[a] == a)
        return a;
    return fa[a] = find(fa[a]); 
} 
int main()
{
    
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &e[++m].c);
        e[m].a = 0, e[m].b = i;
    }
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
        {
            int a;
            scanf("%d", &a);
            if (!vis[i][j] || !vis[j][i])
            {
                vis[i][j] = vis[j][i] = 1;
                e[++m].a = i, e[m].c = a, e[m].b = j;       
            }
        }
    sort(e + 1, e + 1 + m, cmp);
    for (int i = 0; i <= n; i++)
        fa[i] = i;
    for (int i = 1; i <= m; i++)
    {
        if (cnt == n)
            printf("%d", ans), exit(0);
        if (find(e[i].a) != find(e[i].b))
        {
            fa[find(e[i].a)] = find(e[i].b);
            ans += e[i].c;
        //  printf ("%d %d %d\n", e[i].b, e[i].a, e[i].c);
            cnt++;
        }
    }
}

洛谷P1550打井

原文:https://www.cnblogs.com/liuwenyao/p/10226273.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!