TLE 72pts qwq

P3355 骑士共存问题

_Ad_Astra_ @ 2023-10-02 16:57:21

RT,悬赏1关注(码风较丑见谅)

#include <bits/stdc++.h>
using namespace std;
//#define int long long
const int inf=0x3f3f3f3f;
int n,m,s,t,dis[500010],now[500010],head[500010],cnt,b[210][210];
struct node
{
    int to,nxt,flow;
    node(){}
    node(int _to,int _nxt,int _flow)
    {
        to=_to,nxt=_nxt,flow=_flow;
    }
}g[60000010];
void add(int u,int v,int flow)
{
//  cout<<"output from function add(int u,int v,int flow): u="<<u<<",v="<<v<<",flow="<<flow<<endl;
    g[cnt]=node(v,head[u],flow);
    head[u]=cnt++;
    g[cnt]=node(u,head[v],0);
    head[v]=cnt++;
//  cout<<u<<" "<<v<<" "<<flow<<endl;
}
bool bfs()
{
    for(int i=1;i<=t;i++)dis[i]=-2;
    dis[s]=0;
    queue<int>q;
    q.push(s);
    now[s]=head[s];
    while(!q.empty())
    {
        int u=q.front();q.pop();
        int id=head[u];
//      cout<<"output from function bfs(): u="<<u<<endl;
        while(id!=-1)
        {
            int v=g[id].to,flow=g[id].flow;
//          cout<<"output from function bfs(): v="<<v<<",id="<<id<<",flow="<<flow<<endl;
            if(flow>0&&dis[v]==-2)
            {
                dis[v]=dis[u]+1;
                now[v]=head[v];
                if(v==t)return 1;
                q.push(v);
            }
            id=g[id].nxt;
        }
    }
    return 0; 
}
int dfs(int u,int flow)
{
    if(u==t)return flow;
    int ans=0,id=now[u];
    while(id!=-1)
    {
        int v=g[id].to,pflow=g[id].flow;
        if(pflow>0&&dis[v]==dis[u]+1)
        {
            int pans=dfs(v,min(flow,pflow));
            if(!pans)dis[v]=-2;
            g[id].flow-=pans;
            g[id^1].flow+=pans;
            ans+=pans;
            flow-=pans;
        }
        id=g[id].nxt;
    }
    return ans;
}
int dinic()
{
    int ans=0;
    while(bfs())ans+=dfs(s,inf);
    return ans;
}
int getid(int x,int y)
{
    return n*(x-1)+y;
}
int dx[8]={-1,-2,2,1,-1,-2,2,1};
int dy[8]={-2,-1,-1,-2,2,1,1,2};

signed main()
{
    cin>>n>>m;
    s=0;
    t=n*n+1;
    for(int i=0;i<=t;i++)head[i]=-1;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        b[x][y]=1;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(!b[i][j])
                if((i+j)%2)add(s,getid(i,j),1);
                else add(getid(i,j),t,1);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if((i+j)%2)
                for(int k=0;k<8;k++)
                {
                    int x=i+dx[k],y=j+dy[k];
                    if(x>=1&&x<=n&&y>=1&&y<=n&&!b[x][y])
                        add(getid(i,j),getid(x,y),inf);
                }
    cout<<n*n-m-dinic()<<endl;
    return 0; 
}

by SnowTrace @ 2023-10-02 17:11:11

@lehe 当前弧优化好像没写


by _Ad_Astra_ @ 2023-10-02 17:15:24

@Phantom2009 应该写了吧


by SnowTrace @ 2023-10-02 17:27:06

@Lehe now数组好像是你写的当前弧吧,我看了一眼当前弧优化好像不是这么写的。。。


by _Ad_Astra_ @ 2023-10-02 17:44:30

@Phantom2009 我看看,板子因为我懒得写了有一部分贴的以前写过的/kk


|