ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

棋盘上的守卫

2022-07-29 18:32:47  阅读:138  来源: 互联网

标签:return fa ll 100005 守卫 Edge 棋盘


棋盘上的守卫

  在( i,j )这个点上我们可以放置两种守卫,第一种是横向守卫,第二种是竖向守卫,所以它们之间只能选择一种,可以抽象成一条边,链接的是横向的第 i 个阶段,竖向的第 j 个阶段,为了方便,我们将 j的下标写作j + n

可以得到一条性质: 对于任意一个点 i, 若 i > n,则这是列的阶段。

  • 将行列看成 n+m个点。将每个格点放置守卫看成所在行列连了一条边,然后把每条边定向,如果被指向表示当前格点对当前 行/列 进行了保护。

  • 这样就会有 n+m个点,n+m条有向边,同时每条边最多有 1 的入度。形成了基环树森林。

如果当前两个点在同一集合,那么判断是否已经成环,如果不成环还可以加上这一条边。
如果当前两个点不在同一个集合,那么判断是否存在一个点所在集合没有成环,如果是,可以加边。

 //基环树 
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Edge {
    ll u, v, w;
} edge[100005];
ll fa[100005];
bool vis[100005];
ll Find(ll x) {
    if (x == fa[x])
        return x;
    return fa[x] = Find(fa[x]);
}
bool cmp(Edge x, Edge y) { return x.w < y.w; }
int main() {
    ll n, m, a, idx = 0;
    scanf("%lld %lld", &n, &m);
    for (ll i = 1; i <= n; i++) {
        for (ll j = 1; j <= m; j++) {
            scanf("%lld", &a);
            edge[++idx].u = i, edge[idx].v = j + n, edge[idx].w = a;
        }
    }
    for (ll i = 1; i <= m + n; i++) {
        fa[i] = i;
    }
    sort(edge + 1, edge + idx + 1, cmp);
    ll ans = 0;
    for (ll i = 1; i <= idx; i++) {
        ll x = Find(edge[i].u), y = Find(edge[i].v);
        if (vis[x] && vis[y]) { //如果已经成环
            continue;
        } else if (x == y) { //如果在一个集合,连一条边可以成环 
            vis[y]=vis[x] = 1;//记录这两边已经成一个环 
            ans += edge[i].w;
        } else {
            fa[x] = y; 
            ans += edge[i].w;
            vis[y] = vis[y] | vis[x];//如果原x或y与别的树成环 ,记录y是已成环树 
        }
    }
    printf("%lld", ans);
    return 0;
}

 

标签:return,fa,ll,100005,守卫,Edge,棋盘
来源: https://www.cnblogs.com/pangtuan666/p/16533204.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有