hdu 4619 Warm up 2_最大独立集

来源:互联网 发布:月薪3万的程序员 编辑:程序博客网 时间:2024/05/22 08:20

三个人整个下午都想不出这题

后来看题解,竟然用匈牙利算法的最大独立集,我顿时晕了。

题意:给竖着和横着的方块,除去重叠的,最多能留下几个方块

#include <cstdlib>#include <iostream>using namespace std;#define N 1010struct Point{    int x,y;    Point(){}    Point(int a,int b){x=a;y=b;}    bool operator==(const Point &a)const{        return x==a.x&&y==a.y;    }}pn[N],pm[N];int link[N],n,m;bool vis[N],g[N][N];bool judge(Point a,Point b){    if(a==b||Point(a.x+1,a.y)==b||Point(b.x,b.y+1)==a||Point(a.x+1,a.y)==Point(b.x,b.y+1))        return 1;    return 0;}bool dfs(int u){    int i;    for(i=0;i<m;i++){        if(!vis[i]&&g[u][i]){            vis[i]=1;            if(link[i]==-1||dfs(link[i])){                link[i]=u;                return 1;            }        }    }    return 0;}int main(int argc, char *argv[]){    int i,j;    while(scanf("%d%d",&n,&m)&&m||n){        memset(g,0,sizeof(g));        for(i=0;i<n;i++)            scanf("%d%d",&pn[i].x,&pn[i].y);        for(i=0;i<m;i++)            scanf("%d%d",&pm[i].x,&pm[i].y);        for(i=0;i<n;i++)            for(j=0;j<m;j++)                if(judge(pn[i],pm[j]))                    g[i][j]=1;        memset(link,-1,sizeof(link));        int sum=0;        for(i=0;i<n;i++){            memset(vis,0,sizeof(vis));            sum+=dfs(i);        }        printf("%d\n",n+m-sum);    }       //system("PAUSE");    return EXIT_SUCCESS;}


原创粉丝点击