[luogu 3355] 骑士共存问题 {匈牙利算法} help!!!

news/2025/1/20 10:26:31/

题目

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; 
}

http://www.ppmy.cn/news/218472.html

相关文章

bzoj3355[Usaco2004 Jan]有序奶牛*

bzoj3355[Usaco2004 Jan]有序奶牛 题意&#xff1a; 约翰的N头牛排成一行挤奶时&#xff0c;有确定的顺序。他拥有L条关于奶牛顺序的信息&#xff0c;所有的信息都写成“A在B的前面”这样的形式。请帮助约翰删除尽可能多的冗余信息&#xff0c;但要保证能推出原有的顺序。n≤15…

洛谷 [P3355] 骑士共存问题

二分图求最大独立点集 本问题在二分图中已处理过,此处用dinic写了一遍 #include <iostream> #include <cstdio> #include <algorithm> #include <cstdlib> #include <queue> #include <cstring> using namespace std; const int MAXN40005…

洛谷P3355 骑士共存问题

题目描述 在一个 n*n个方格的国际象棋棋盘上&#xff0c;马&#xff08;骑士&#xff09;可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍&#xff0c;骑士不得进入 对于给定的 n*n 个方格的国际象棋棋盘和障碍标志&#xff0c;计算棋盘上最多可以放置多少个骑士&#x…

lugou P3355 骑士共存问题

题面传送门 显然是二分图建模板子题。 观察可得&#xff0c;可以黑白染色建图。 那么从黑格向白格建边跑二分图最小点覆盖即可&#xff0c;注意要用全部点减去最小点覆盖。 代码实现: #include<cstdio> #include<cstring> #include<queue> #define min(a,b)…

洛谷_3355_网络流/最大匹配

题目&#xff1a; 题目描述 在一个 n*n个方格的国际象棋棋盘上&#xff0c;马&#xff08;骑士&#xff09;可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍&#xff0c;骑士不得进入 对于给定的 n*n 个方格的国际象棋棋盘和障碍标志&#xff0c;计算棋盘上最多可以放置…

洛谷 P3355 骑士共存问题

题面 题意 给出一张边长为n,有几个障碍点的棋盘,问最多可以放几个骑士使他们不互相攻击. 做法 我们可以反过来考虑,先将棋盘放满骑士,计算至少去掉几个骑士. 经过观察,我们可以发现,相同颜色的格子上的棋子无法相互攻击,因此可以让超级源点连想每一个红点,每一个黄点连向超…

Luogu P3355 骑士共存问题

题目链接 \(Click\) \(Here\) 二分图最大独立集。对任意两个可以相互攻击的点&#xff0c;我们可以选其中一个。对于不会互相攻击的&#xff0c;可以全部选中。所以我们只需要求出最大匹配&#xff0c;根据定理&#xff0c;二分图最大独立集等于点数减去最大匹配&#xff0c;就…

[P3355骑士共存]

P3355 方格里面选若干个点放上骑士&#xff0c;骑士之间不能互相攻击到。问最多能放多少骑士。emm。可能是被费用流整自闭了&#xff0c;还以为这道题也是个神题&#xff0c;在想怎么用费用流跑。看了一下自己之前居然写过这道题&#xff0c;代码居然是匈牙利&#xff1f;&…