正解:网络流

解题报告:

传送门$QwQ$

看到不能出现给定的讨厌的图形,简单来说就,特殊边两侧的方格不能同时再连方格.

所以如果出现,就相当于是四种方案?就分别炸四个格子.

然后冷静分析一波之后发现对于特殊边两侧的格子炸那个是没有影响的?于是这两个格子就只用选较小的一个炸就好,于是现在就变成了三种方案,可以考虑和之前做的那道,酒店之王,差不多的建图,$over$

洛谷$P3756\ [CQOI2017]$老$C$的方块 网络流洛谷$P3756\ [CQOI2017]$老$C$的方块 网络流
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ll long long
#define mp make_pair
#define P pair<int,int>
#define t(i) edge[i].to
#define w(i) edge[i].wei
#define n(i) edge[i].nxt
#define ri register int
#define rb register int
#define rc register char
#define rp(i,x,y) for(int i=x;i<=y;++i)
#define my(i,x,y) for(int i=x;i>=y;--i)
#define e(i,x) for(int i=head[x];~i;i=n(i))

const int N=5e5+10,inf=1e9;
int n,dep[N],head[N],cur[N],S,T,ed_cnt=-1,col[N],mvx[4]={1,-1,0,0},mvy[4]={0,0,1,-1};
struct ed{int to,nxt,wei;}edge[N<<2];
struct node{int x,y,val;}nod[N];
map<P,int>mapp;

il int read()
{
    rc ch=gc;ri x=0;rb y=1;
    while(ch!='-' && (ch>'9' || ch<'0'))ch=gc;
    if(ch=='-')ch=gc,y=0;
    while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=gc;
    return y?x:-x;
}
il void ad(ri x,ri y,ri z)
{
    //printf("%d -> %d : %d\n",y,x,z);
    edge[++ed_cnt]=(ed){x,head[y],z};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x],0};head[x]=ed_cnt;}
il bool bfs()
{
    queue<int>Q;Q.push(S);memset(dep,0,sizeof(dep));dep[S]=1;
    while(!Q.empty())
    {
        ri nw=Q.front();Q.pop();//printf("nw=%d\n",nw);
        e(i,nw)if(w(i) && !dep[t(i)]){dep[t(i)]=dep[nw]+1,Q.push(t(i));if(t(i)==T)return 1;}
    }
    return 0;
}
il int dfs(ri nw,ri flow)
{
    if(nw==T || !flow)return flow;ri ret=0;
    for(ri &i=cur[nw];~i;i=n(i))
        if(w(i) && dep[t(i)]==dep[nw]+1)
        {ri tmp=dfs(t(i),min(flow,w(i)));ret+=tmp,w(i)-=tmp;w(i^1)+=tmp,flow-=tmp;}
    return ret;
}
il int dinic(){int ret=0;while(bfs()){rp(i,S,T)cur[i]=head[i];while(int d=dfs(S,inf))ret+=d;}return ret;}
il int cal(ri x,ri y){return (2*(x%4>=2)+(1^((x+y)&1)));}
il void build1(ri nw)
{
    rp(i,0,3)
    {
        ri tx=nod[nw].x+mvx[i],ty=nod[nw].y+mvy[i],to=mapp[mp(tx,ty)];
        if(to){if(col[to]==2)ad(to,nw,min(nod[nw].val,nod[to].val));else ad(nw,to,inf);}
    }
}
il void build2(ri nw)
{
    rp(i,0,3)
    {
        ri tx=nod[nw].x+mvx[i],ty=nod[nw].y+mvy[i],to=mapp[mp(tx,ty)];
        if(to){if(col[to]!=2)ad(to,nw,inf);}
    }
}

int main()
{
    //freopen("3756.in","r",stdin);freopen("3756.out","w",stdout);
    read();read();n=read();S=0;T=n+1;memset(head,-1,sizeof(head));
    rp(i,1,n){nod[i]=(node){read(),read(),read()};mapp[mp(nod[i].x,nod[i].y)]=i;col[i]=cal(nod[i].x,nod[i].y);}
    rp(i,1,n)
    {
        //printf("col[%d]=%d\n",i,col[i]);
        switch(col[i])
        {
        case 0:{ad(i,S,nod[i].val);break;}
        case 1:{build1(i);break;}
        case 2:{build2(i);break;}
        case 3:{ad(T,i,nod[i].val);break;}
        }
    }
    printf("%d\n",dinic());
    return 0;
}
View Code

相关文章:

  • 2021-07-10
  • 2021-10-01
  • 2022-01-20
  • 2021-06-22
  • 2022-03-01
  • 2021-12-11
猜你喜欢
  • 2021-08-27
  • 2021-07-20
  • 2021-12-21
  • 2022-01-08
  • 2021-10-26
  • 2022-01-21
  • 2021-05-15
相关资源
相似解决方案