1. 程式人生 > >[luogu 3355] 騎士共存問題 {匈牙利演算法} help!!!

[luogu 3355] 騎士共存問題 {匈牙利演算法} help!!!

題目

https://www.luogu.org/problemnew/show/P3355#sub


解題思路

這道題自從上一次得了90分後,就一直擱置了很久,找不到錯誤。請各位大佬幫忙!!!


程式碼匈牙利演算法

#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int b[8]={-2,-1,1,2,2,1,-1,-2},c[8]={1,2,2,1,-1,-2,-2,-1};
struct node{int y,next;
}a[320032]; int rr,ans,sum,add,n,m,xx,yy,link[40001],v[40001],list[40001],t[201][201]; inline int read() { int f=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) f=(f<<3)+(f<<1)+c-48,c=getchar(); return f; } void write(int x){if (x>9) write(x/10); putchar(x%10+
48);} inline bool find (int q){ for (register int i=list[q];i;i=a[i].next) if (!v[a[i].y]) { v[a[i].y]=1; int u=link[a[i].y]; link[a[i].y]=q; if (!u||find(u)) return 1; link[a[i].y]=u; } return 0; } signed main
() { n=read(); m=read(); ans=n*n-m; for (register int i=1;i<=m;i++) t[(xx=read())][(yy=read())]=-1; for (register int i=1;i<=n;i++) for (register int j=1;j<=n;j++) if (!t[i][j]&&((i+j)&1)) { t[i][j]=++add; for (register int k=0;k<8;k++) { xx=i+b[k]; yy=j+c[k]; if ((xx>=1&&xx<=n)&&(yy>=1&&yy<=n)) { if (!t[xx][yy]) t[xx][yy]=++rr; if (t[xx][yy]!=-1) a[++sum].y=t[xx][yy],a[sum].next=list[add],list[add]=sum; } } } for (register int i=1;i<=add;i++) { memset(v,0,sizeof(v)); if (find(i)) ans--; } write(ans); return 0; }