• BZOJ4883: [Lydsy1705月赛]棋盘上的守卫(最小环套树森林&优化定向问题)


    4883: [Lydsy1705月赛]棋盘上的守卫

    Time Limit: 3 Sec  Memory Limit: 256 MB
    Submit: 475  Solved: 259
    [Submit][Status][Discuss]

    Description

    在一个n*m的棋盘上要放置若干个守卫。对于n行来说,每行必须恰好放置一个横向守卫;同理对于m列来说,每列
    必须恰好放置一个纵向守卫。每个位置放置守卫的代价是不一样的,且每个位置最多只能放置一个守卫,一个守卫
    不能同时兼顾行列的防御。请计算控制整个棋盘的最小代价。

    Input

    第一行包含两个正整数n,m(2<=n,m<=100000,n*m<=100000),分别表示棋盘的行数与列数。
    接下来n行,每行m个正整数
    其中第i行第j列的数w[i][j](1<=w[i][j]<=10^9)表示在第i行第j列放置守卫的代价。

    Output

    输出一行一个整数,即占领棋盘的最小代价。

    Sample Input

    3 4
    1 3 10 8
    2 1 9 2
    6 7 4 6

    Sample Output

    19

    HINT
    在(1,1),(2,2),(3,1)放置横向守卫,在(2,1),(1,2),(3,3),(2,4)放置纵向守卫。

    思路:一眼看出最小费用流,zkw跑几发T了,然后学习了下正解:环套树森林。

    我们把行到列加无向边,然后得到最小环套树森林就ok了。(N+M个点,N+M个环,说明有一个环。)

    得到这个环套树森林后,我们来定向,即这个无向边指向行还是列。我们假设指向的方向代表守卫的方向。假设多条边有公共顶点,他们中最多一个点指向这个公共顶点。  那么如果我们知道了一个连通块的一个指向,那么连通块的其他所有边指向都可以推出,而且这里二分图,所以环是偶环,不会出现矛盾。  这也是为什么可以这么做,即得到是环套树森林一定能得到合理方案。

    Kruscal求最小环套树森林:按照常规的Kruscal来做,只是多了一个tag标记,表示它是否有环,合并之前保证最多一个环。

    #include<bits/stdc++.h>
    #define ll long long
    #define rep(i,a,b) for(int i=a;i<=b;i++)
    using namespace std;
    const int maxn=100010;
    int fa[maxn],tag[maxn],tot; ll ans;
    struct in{
        int x,y,len;
        in(){}
        in(int xx,int yy,int LL):x(xx),y(yy),len(LL){}
        bool friend operator <(in w,in v){return w.len<v.len; }
    }s[maxn];
    int find(int x){
        if(x==fa[x]) return x;
        return fa[x]=find(fa[x]);
    }
    int main()
    {
        int N,M,x; scanf("%d%d",&N,&M);
        rep(i,1,N)
          rep(j,1,M){
             scanf("%d",&x);
             s[++tot]=in(i,N+j,x);
        }
        sort(s+1,s+tot+1);
        rep(i,1,N+M) fa[i]=i;
        rep(i,1,tot){
            int a=find(s[i].x),b=find(s[i].y);
            if(tag[a]&&tag[b]) continue;
            if(a==b) tag[a]=1;
            else fa[b]=a,tag[a]|=tag[b];
            ans+=s[i].len;
        }
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    Photoshop 图文并茂常用快捷键
    程序员放松的8个好网站推荐
    Ehcache详细解读
    IT人士必去的10个网站
    [javascript]避免悲剧 密码生成器
    jQuery创建实例与原型继承揭秘
    [javascript]快速交换javascript变量的值
    [javascript]web216安全色拾色器colorpicker 支持浏览器边缘碰撞翻转(原生js)
    [Javascript]单例模式(singleton )
    duffsDevice 高速版
  • 原文地址:https://www.cnblogs.com/hua-dong/p/9978308.html
Copyright © 2020-2023  润新知