首页 > 其他分享 >题解:AT_abc193_f [ABC193F] Zebraness

题解:AT_abc193_f [ABC193F] Zebraness

时间:2024-12-11 20:10:20浏览次数:7  
标签:return 格子 val int 题解 abc193 Zebraness now dis

题解:AT_abc193_f [ABC193F] Zebraness

Tag

网络流

Solution

我们要求相邻格子颜色不同的最多个数,可以转化为总边数减去相邻格子颜色相同的最少个数。

我们发现颜色相同这一性质很难建图,所以我们将原图黑白染色,染后将黑色格子的原本颜色反转,这样就保证了原本相邻的颜色相同格子变为了颜色不同格子,接下来就直接求修改后图中相邻格子颜色不同的最少个数。这下就最小割板子了,将所有 W 格子与源点 \(s\) 相连,所有 B 与汇点 \(t\) 相连,边权都为 INF。再把图中存在相邻关系的边一连,在建好的图中跑 Dinic 即可。

注意处理中的细节,需要把二维上的点转换为一维编号。

Code

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=1e6+5;
const int INF=0x3f3f3f3f;
int n,m,s,t,k;
struct edge
{
    int nxt,to,val;
}e[N];
int ans;
int now[N];
int dis[N],head[N],cnt=1;

void add(int u,int v,int w)
{
    // cout<<u<<" "<<v<<" "<<w<<endl;
    e[++cnt].to=v;
    e[cnt].val=w;
    e[cnt].nxt=head[u];
    head[u]=cnt;

    e[++cnt].to=u;
    e[cnt].val=0;
    e[cnt].nxt=head[v];
    head[v]=cnt;
}

bool bfs()
{
    memset(dis,-1,sizeof(dis));
    queue<int> q;
    q.push(s);
    dis[s]=0;
    now[s]=head[s];
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(int i=head[u];i;i=e[i].nxt)
        {
            int v=e[i].to;
            if(e[i].val>0&&dis[v]==-1)
            {
                q.push(v);
                dis[v]=dis[u]+1;
                now[v]=head[v];
                if(v==t)return 1;
            }
        }
    }
    return 0;
}

int dfs(int x,int sum)
{
    if(x==t)return sum;
    int k,res=0;
    for(int i=now[x];i&&sum;i=e[i].nxt)
    {
        now[x]=i;
        int v=e[i].to;
        if(e[i].val>0&&dis[v]==dis[x]+1)
        {
            k=dfs(v,min(sum,e[i].val));
            if(k==0)dis[v]=-1;
            e[i].val-=k;
            e[i^1].val+=k;
            sum-=k;
            res+=k;
        }
    }
    return res;
}

void Dinic()
{
    while(bfs())
        ans+=dfs(s,INF);
    return ;
}

char mp[105][105];
int id(int i,int j){return (i-1)*n+j;}
int dd[15][15]={{1,0},{-1,0},{0,1},{0,-1}};

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)
            cin>>mp[i]+1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if((i+j)&1)
            {
                if(mp[i][j]=='W')mp[i][j]='B';
                else if(mp[i][j]=='B')mp[i][j]='W';
            }
        }
    }
    s=0,t=n*n+1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            // cout<<"*"<<i<<" "<<j<<" "<<id(i,j)<<endl;
            if(mp[i][j]=='B')add(s,id(i,j),INF);
            if(mp[i][j]=='W')add(id(i,j),t,INF);
            for(int k=0;k<4;k++)
            {
                if(i+dd[k][0]>=1&&i+dd[k][0]<=n&&j+dd[k][1]>=1&&j+dd[k][1]<=n)
                    add(id(i,j),id(i+dd[k][0],j+dd[k][1]),1);
            }
        }
    }
    Dinic();
    // cout << ans << endl;
    cout<<2*n*(n-1)-ans<<endl;
    return 0;
}

标签:return,格子,val,int,题解,abc193,Zebraness,now,dis
From: https://www.cnblogs.com/RyanAdam/p/18600616

相关文章

  • ABC381 C-E题解
    C-11/22Substring枚举每个/,从/出发向左右两边扩展到最远。因为每个点最多能被访问一次(向右只扩展2,向左只扩展1),复杂度为\(O(n)\)。intans=0;for(inti=0;i<n;i++){if(s[i]!='/')continue;intl=i-1,r=i+1,len=1;while(l>=......
  • Luogu P9606 CERC2019 ABB 题解 [ 绿 ] [ KMP ] [ 字符串哈希 ]
    ABB:KMP的做法非常巧妙。哈希思路显然正着做一遍哈希,倒着做一遍哈希,然后枚举回文中心即可。时间复杂度\(O(n)\)。代码#include<bits/stdc++.h>#definefifirst#definesesecond#definelc(p<<1)#definerc((p<<1)|1)usingnamespacestd;typedeflonglongll;......
  • ARC161F Everywhere is Sparser than Whole (Judge) 题解
    题意定义一张图的密度为它的边数与点数的比值。给定一张\(n\)个点、\(m=dn\)条边的无向图,记点集为\(V\)。你需要判断,任取\(V\)的非空真子集\(X\),\(X\)的导出子图的密度是否一定严格小于\(d\)。多测,\(1\leqn,d,\summ\leq50000\)。题解对于一张流网络,记\(s,......
  • 河南工大2024新生周赛(7)----命题人 刘义 题解
    问题A:圆:这是一个数学题,画图可得,4个圆时,分割成14个区域,可以推导出结论:当圆为0个时,区域数为1个,当圆有x个的时候,区域数有x*x-x+2;#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongintn;signedmain(){inta,b;//a为圆的个数,b为区域数cin>>......
  • 埃氏筛/线性筛+质数与约数一本通题解
    埃氏筛:筛选\(1...n\)中所有的质数考虑一个质数\(x\),它的\(2x,3x,4x...n/x*x\)都是合数,打上标记即可\(O(NloglogN)\)for(inti=2;i<=n;i++){if(vis[i])continue;p[++cnt]=i;for(intj=i;j<=n/i;j++){vis[i*j]=1;}}线性筛:考虑一个合数......
  • P1541 [NOIP2010 提高组] 乌龟棋 题解
    动规题。动态规划分为3步:1.定义数组元素含义。2.找到数组元素之间的关系式。3.找出初始值。第一步我们不难发现这道题可以现在dp数组中设一个数组dp[i]表示到了第i个格子所获得的最大分数。再思考题目中给的4种卡牌。我们可以发现,dp[i]可以由dp[i-1]+a[i],dp[i-2]+a[i],dp......
  • P9346 无可奈何花落去 题解
    P9346无可奈何花落去题解这个期望第一眼看上去是困难的。然而发现\(E=Px\),贡献\(x\)是可枚举的,于是转化为了一个求概率的问题。这个概率同样难以计算,然而发现状态的个数是有限的,对于选取\(x\)条边断掉它的总方案数就是\({n-1\choosex}\),那么直接求方案数就可以了。想到......
  • Shopee虾皮新手小白必读:十大常见问题解答
     随着跨境电商的兴起,越来越多的新手卖家选择在Shopee(虾皮)平台上开店。以下是针对Shopee新手小白的十大常见问题及其解答,帮助您快速上手,顺利开启您的电商之旅。问题一:没有完成新手任务有什么影响?答:若没有完成,你将会错过对接专属客户经理的机会及部分活动资源。开新店、报名......
  • 题解:P11377 [GESP202412 七级] 武器购买
    思路这是一个典型的背包问题。我们可以设\(dp_{j}\)为武器总强度为\(j\)的情况下的最小花费。于是,根据背包问题的模型我们就能得出:\[dp_j=\max_{1\lei\len}dp_{j-c_i}+p_i\]最终,答案就为第一个大于等于\(P\)的\(dp_j\)的下标\(j\)。时间复杂度为\(O(Tn......
  • CF1601 题解
    纪念一下场切5题。A给定序列\(a\),一次操作可选\(k\)个数,同时减去它们的按位与。问有多少个\(k\)能把\(a\)全消为\(0\)。\(n\le10^5\)。对于一个位,\(1\)的个数的变化量必为\(k\)的倍数。所以\(k\)要是每一位\(1\)的个数的\(gcd\)的因数。B青蛙跳井,初始......