求助,80分TLE
查看原帖
求助,80分TLE
381706
EXnoLph楼主2022/2/22 23:31

第一个点与第十个点TLE。

#include<bits/stdc++.h>
using namespace std;
int to[50005],nxt[50005],head[50005];
int vis[50005],use[50005];
int oer[50005];
const int dx[]={3,3,1,1,-3,-3,-1,-1},dy[]={1,-1,3,-3,1,-1,3,-3};
int top;
void add(int now,int tow){
	to[++top]=tow;
	nxt[top]=head[now];
	head[now]=top;
}
bool dfs(int x){
	for (int i=head[x];i;i=nxt[i]){
		int ver=to[i];
		if(!vis[ver]){
			vis[ver]=1;
			if(use[ver]==0||dfs(use[ver])){
				use[ver]=x;
				use[x]=ver;
				return 1;
			}
		}
	}
	return 0;
}
int main(){
	int n,m;
	int k;
	scanf("%d%d%d",&n,&m,&k);
	int x,y;
	int tmp=0;
	for(int i=1;i<=k;i++){
		scanf("%d%d",&x,&y);
		if(!oer[x*m-m+y])oer[x*m-m+y]=1;
		else{
			tmp++;
		}
	}
	for(int i=2;i<=n;i+=2){
		for(int j=1;j<=m;j++){
			if(oer[i*m-m+j])continue;
			for(int k=0;k<8;k++){
				x=i+dx[k];
				y=j+dy[k];
				if(x>0&&x<=n&&y>0&&y<=m&&!oer[(x-1)*m+y]){
					add((i-1)*m+j,(x-1)*m+y);
				}
			}
		}
	}
	int sum=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(dfs((i-1)*m+j)){sum++;}
			memset(vis,0,sizeof(vis));
		}
	}
	cout<<n*m-sum-k+tmp;
}
2022/2/22 23:31
加载中...