1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
#define ll long long #define inf 0x3f3f3f3f #define N 50000 using namespace std; struct { int dis,to,next; }e[1000055]; inline int read(){ int x=0,w=0;char ch=getchar(); while (!isdigit(ch))w|=ch=='-',ch=getchar(); while (isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); return w?-x:x; } int dx[]={-2,-2,-1,-1,1,1,2,2},dy[]={-1,1,-2,2,2,-2,-1,1},tot,id[207][207],ma[207][207],cnt=1,head[N],dep[N],inque[N],cur[N],n,m,s,t; inline void add(int u,int v,int d){ e[++cnt].to=v; e[cnt].dis=d; e[cnt].next=head[u]; head[u]=cnt; e[++cnt].to=u; e[cnt].dis=0; e[cnt].next=head[v]; head[v]=cnt; } bool bfs(){ memset(dep,0,sizeof(dep)); queue<int>q;q.push(s);dep[s]=1; while (!q.empty()){ int u=q.front();q.pop();inque[u]=0; for (int i=head[u];i;i=e[i].next){ int v=e[i].to; if (!dep[v]&&e[i].dis){ dep[v]=dep[u]+1; if (!inque[v]) q.push(v),inque[v]=1; } } } return dep[t]; } int dfs(int u,int mn){ if (u==t)return mn; int used=0,mi; for (int &i=cur[u];i;i=e[i].next){ int v=e[i].to; if (e[i].dis&&dep[v]==dep[u]+1) if (mi=dfs(v,min(e[i].dis,mn-used))){ e[i].dis-=mi; e[i^1].dis+=mi; used+=mi; if (used==mn)break; } } return used; } int Dinic(){ int res=0; while (bfs()){ for (int i=s;i<=t;++i)cur[i]=head[i]; res+=dfs(s,inf); } return res; } signed main(){ n=read(),m=read(),s=0,t=n*n-m+1; for (int i=1;i<=m;++i)ma[read()][read()]=1; for (int i=1;i<=n;++i) for (int j=1;j<=n;++j) if (!ma[i][j]){ id[i][j]=++tot; if ((i+j)&1)add(s,id[i][j],1); else add(id[i][j],t,1); } for (int i=1;i<=n;++i) for (int j=1;j<=n;++j) if (!ma[i][j]){ for (int p=0;p<8;++p){ int x=i+dx[p],y=j+dy[p]; if (ma[x][y]||x<1||y<1||x>n||y>n)continue; if ((i+j)&1) add(id[i][j],id[x][y],1); else add(id[x][y],id[i][j],1); } } printf("%dn",n*n-m-Dinic()); }
|
近期评论