hdu 4619

来源:互联网 发布:135端口还有漏洞吗 编辑:程序博客网 时间:2024/06/05 18:18
题意分析: 水平N牌 ,垂直M牌 ,水平相互独立(即不想交) ,垂直也是如此。     可以看出这是一个二分图。    但是水平的牌和垂直的会相交,求最少踢出去几张牌,使得剩下的牌都不相交 。    那么把水平和垂直相交的牌连边,求出最大匹配数,把这些匹配的边切断,剩下的牌就相互不交了。也就是最大独立点。 代码写漂亮点,即使拿不到奖,对找工作有帮助的,同学们。#include<stdio.h>#include<vector>#include<string.h>#define N 3000using namespace std;vector<int>map[N];int n,link[N],mark[N];pair<int,int>p1[N];pair<int,int>p2[N];int dfs(int u){int i;for(i=0;i<map[u].size();i++){if(!mark[map[u][i]]){mark[map[u][i]]=1;if(link[map[u][i]]==-1||dfs(link[map[u][i]])==1){link[map[u][i]]=u;return 1;}}}return 0;}int inint(){int i,sum=0;memset(link,-1,sizeof(link));for(i=0;i<n;i++){memset(mark,0,sizeof(mark));if(dfs(i)==1)sum++;}return sum;}int main(){int m,x,y,ans,i,j;while(scanf("%d%d",&n,&m)!=EOF){if(n==0&&m==0)break;for(i=0;i<n;i++){scanf("%d%d",&x,&y);p1[i]=make_pair(x,y);}for(i=0;i<m;i++){scanf("%d%d",&x,&y);p2[i]=make_pair(x,y);}for(i=0;i<n;i++)map[i].clear();for(i=0;i<n;i++){for(j=0;j<m;j++){int x1,y1,x2,y2;x1=p1[i].first;y1=p1[i].second;x2=p2[j].first;y2=p2[j].second;if((x1==x2&&y1==y2)||(x1==x2&&y1==y2+1)||(x2==x1+1&&y1==y2)||(x2==x1+1&&y1==y2+1))map[i].push_back(j);}}ans=n+m-inint();printf("%d\n",ans);}return 0;}

0 0
原创粉丝点击