求助二分图
  • 板块学术版
  • 楼主cmll02
  • 当前回复5
  • 已保存回复5
  • 发布时间2020/5/4 14:08
  • 上次更新2023/11/7 03:12:32
查看原帖
求助二分图
171487
cmll02楼主2020/5/4 14:08

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
2020/5/4 14:08
加载中...