zoukankan      html  css  js  c++  java
  • BZOJ 4883 棋盘上的守卫 解题报告

    BZOJ4883 棋盘上的守卫

    考虑费用流,但是数据范围太大

    考虑 (i)(j) 列如果被选择,那么要么给 (i) 行,要么给 (j)

    把选择 (i)(j) 列当做一条边,每一行每一列建成一个点,于是我们可以用边的方向来代表我们给的究竟是第 (i) 行还是第 (j)

    这样,当全部覆盖以后,我们发现图的每个点入度为 (1) ,本质上是一个基环森林,于是我们不需要考虑边的方向,只需要求出基环森林即可。

    可以魔改 kruskal ,判断当前联通块是基环树还是树即可


    Code:

    #include <cstdio>
    #include <cctype>
    #include <cstring>
    #include <algorithm>
    #define ll long long
    using std::max;
    using std::min;
    const int SIZE=1<<21;
    char ibuf[SIZE],*iS,*iT;
    //#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),iS==iT?EOF:*iS++):*iS++)
    #define gc() getchar()
    template <class T>
    void read(T &x)
    {
    	x=0;char c=gc();
    	while(!isdigit(c)) c=gc();
    	while(isdigit(c)) x=x*10+c-'0',c=gc();
    }
    const int N=2e5+10;
    int n,m,k;
    ll ans;
    struct node
    {
    	int u,v,w;
    	node(){}
    	node(int a,int b,int c){u=a,v=b,w=c;}
    	bool friend operator <(node a,node b){return a.w<b.w;}
    }E[N];
    int f[N],huan[N];
    int Find(int x){return f[x]=f[x]==x?x:Find(f[x]);}
    int main()
    {
    	read(n),read(m);
    	for(int w,i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    		{
    			read(w);
    			E[++k]=node(i,j+n,w);
    		}
    	for(int i=1;i<=n+m;i++) f[i]=i;
    	std::sort(E+1,E+1+k);
    	for(int i=1;i<=k;i++)
    	{
    		int u=Find(E[i].u),v=Find(E[i].v);
    		if(u!=v&&!(huan[u]&huan[v]))
            {
                huan[u]|=huan[v];
                f[v]=u;
                ans+=E[i].w;
            }
            if(u==v&&!huan[u])
            {
                huan[u]=1;
                ans+=E[i].w;
            }
    	}
    	printf("%lld
    ",ans);
    	return 0;
    }
    

    2019.6.26

  • 相关阅读:
    33选6算法:M个数N个为一组,无重复的排列组合
    文件墙 CFilewall
    公司代码阅读笔记 记于 2013-09-23
    简单的同步MSMQ
    Markdown 使用说明
    Freezable 对象(WPF)
    AngularJS-入门篇
    第二节Unity3D开发环境安装(windows系统)
    第一节Unity3D简介
    数据库出现可疑解决办法
  • 原文地址:https://www.cnblogs.com/butterflydew/p/11088850.html
Copyright © 2011-2022 走看看