RT,运行错误+答案错误,求助
//code
#include <stdio.h>
inline int read()
{
int num=0;char c=getchar();
while(c<48||c>57)c=getchar();
while(c>=48&&c<=57)num=(num<<3)+(num<<1)+(c^48),c=getchar();
return num;
}
struct Edge{
int v,nxt;
}e[5005*8];
int cnt=1,h[5005];
void addedge(int u,int v)
{
//printf("%d and %d connected!\n",u,v);
e[cnt].v=v;
e[cnt].nxt=h[u];
h[u]=cnt++;
}
int n,q,ans,get[5005];
bool vis[5005];
int dfs(int x){
for (int i=h[x];i;i=e[i].nxt)
{
int v=e[i].v;
if (!vis[v])
{
vis[v]=1;
if (!get[v]||dfs(get[v]))
{
get[v]=x;
return 1;
}
}
}
return 0;
}
int Sum[105][105],m;
#include <string.h>
int main(){
n=read(),m=read(),q=read();
for (int i=1;i<=q;i++)
{
int u=read(),v=read();
Sum[u][v]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(((i+j)&1)||Sum[i][j])continue;
int t=(i-1)*m+j;
if(i>2 &&j>1 &&!Sum[i-2][j-1])addedge(t,t-m-m-1);
if(i>2 &&j<m &&!Sum[i-2][j+1])addedge(t,t-m-m+1);
if(i>1 &&j>2 &&!Sum[i-1][j-2])addedge(t,t-m-1-1);
if(i>1 &&j<m-1&&!Sum[i-1][j+2])addedge(t,t-m+1+1);
if(i<n &&j>2 &&!Sum[i+1][j-2])addedge(t,t+m-1-1);
if(i<n &&j<m-1&&!Sum[i+1][j+2])addedge(t,t+m+1+1);
if(i<n-1&&j>1 &&!Sum[i+2][j-1])addedge(t,t+m+m-1);
if(i<n-1&&j<m &&!Sum[i+2][j+1])addedge(t,t+m+m+1);
}
}
for (int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int t=(i-1)*m+j;
if((i+j)&1)continue;
ans+=dfs(t);
memset(vis,0,sizeof(vis));
}
}
printf("%d\n",n*m-ans);
return 0;
}
题面
时空限制:1S,64MB
问题描述
给定一个 N*M 的棋盘,有一些格子禁止放棋子。
问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的“骑士”,类似于中国象棋的“马”,按照“日”字攻击,但没有中国象棋“别马腿”的规则)。
输入格式
第一行包含三个整数N,M,T,其中T表示禁止放置的格子的数量。
接下来T行每行包含两个整数x和y,表示位于第x行第y列的格子禁止放置,行列数从1开始。
输出格式
输出一个整数表示结果。
数据范围
1≤N,M≤100
输入样例:
2 3 0
输出样例:
4