1 solutions

  • 0
    @ 2025-11-5 17:27:15

    C++ :

    //AUTHOR::STDAFX
    //ALGORITHM::Hungary
    
    #define MAXN 110UL
    #define MAXQ 20000UL
    
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    void BFS(int,int);
    inline int cal(int);
    inline int calpos(int,int);
    bool dfs(int);
    
    struct Edge{
    	int v,nx;
    };
    
    struct Point{
    	int x,y;
    };
    
    struct queue{
    	int head,tail;
    	Point data[MAXQ];
    	inline void clr(){
    		head=0;tail=-1;
    		return;
    	}
    	inline void push(Point temp){
    		data[++tail]=temp;
    		return;
    	}
    	inline bool empty(){
    		return tail<head;
    	}
    	inline void pop(){
    		head++;
    		return;
    	}
    	inline Point front(){
    		return data[head];
    	}
    };
    
    int n,m,color[MAXN][MAXN],tempx,tempy,new_color,newx,newy,x,y,headlist[MAXQ],edge_cs,tempid,newid,ans,link[MAXQ];
    int cx[6]={0,1,-1,0,0};
    int cy[6]={0,0,0,-1,1};
    
    bool Map[MAXN][MAXN];
    bool used[MAXQ];
    
    Point temp;
    
    Edge edge[MAXQ<<1];
    
    queue que;
    
    int main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=m;i++){
    		scanf("%d%d",&x,&y);
    		Map[x][y]=1;
    	}
    	//BFS
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			if(!Map[i][j]&&!color[i][j]){
    				BFS(i,j);
    			}
    		}
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			if(color[i][j]==2) continue;
    			for(int k=1;k<=4;k++){
    				newx=i+cx[k];newy=j+cy[k];
    				if(newx<1||newx>n) continue;
    				if(newy<1||newy>n) continue;
    				if(Map[newx][newy]) continue;
    				if(color[newx][newy]==1) continue;
    				tempid=calpos(i,j);newid=calpos(newx,newy);
    				edge[++edge_cs].v=newid;
    				edge[edge_cs].nx=headlist[tempid];
    				headlist[tempid]=edge_cs;
    			}
    		}
    	}
    	//Hungary
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			if(!Map[i][j]&&color[i][j]==1){
    				memset(used,0,sizeof(used));
    				if(dfs(calpos(i,j))){
    					ans++;
    				}
    			}
    		}
    	}
    	printf("%d",ans);
    	return 0;
    }
    
    inline int cal(int temp){
    	if(temp==1){
    		return 2;
    	}
    	return 1;
    }
    
    inline int calpos(int x,int y){
    	return n*(x-1)+y;
    }
    
    bool dfs(int u){
    	for(int i=headlist[u];i!=0;i=edge[i].nx){
    		if(!used[edge[i].v]){
    			used[edge[i].v]=1;
    			if(link[edge[i].v]==0||dfs(link[edge[i].v])){
    				link[edge[i].v]=u;
    				return true;
    			}
    		}
    	}
    	return false;
    }
    
    void BFS(int stx,int sty){
    	color[stx][sty]=1;
    	que.clr();
    	temp.x=stx;temp.y=sty;
    	que.push(temp);
    	while(!que.empty()){
    		tempx=que.front().x;tempy=que.front().y;
    		new_color=cal(color[tempx][tempy]);
    		que.pop();
    		for(int i=1;i<=4;i++){
    			newx=tempx+cx[i];newy=tempy+cy[i];
    			if(newx<1||newx>n) continue;
    			if(newy<1||newy>n) continue;
    			if(color[newx][newy]||Map[newx][newy]) continue;
    			color[newx][newy]=new_color;
    			temp.x=newx;temp.y=newy;
    			que.push(temp);
    		}
    	}
    	return;
    }
    
    • 1

    Information

    ID
    18445
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By