标签:des style blog http color java os strong
2 3 0 0 0 3 0 1 1 1 1 3 4 5 0 1 0 2 3 1 2 2 0 0 1 0 2 0 4 1 3 2 0 0
4 6
题意:一个多米诺骨牌占两个格子,有的占水平的两个格子,有的占据垂直的两个格子,这些多米诺骨牌有的重叠。现在需要移去相互重叠的,求最多留下几个多米诺骨牌。
思路:一个多米诺骨牌占两个格子连一条边,求最大匹配OK!
#include"stdio.h" #include"string.h" #include"queue" using namespace std; #define N 105 #define M 4005 int mark[M],link[M],g[N][N]; int n,m,x,y,t; int head[M]; int dir[4][2]={0,1,0,-1,-1,0,1,0}; struct node { int u,v,next; }map[M]; int max(int a,int b) { return a>b?a:b; } void add(int u,int v) { map[t].u=u; map[t].v=v; map[t].next=head[u]; head[u]=t++; } int find(int k) { int i,v; for(i=head[k];i!=-1;i=map[i].next) { v=map[i].v; printf("%d ",v); if(!mark[v]) { mark[v]=1; if(link[v]==-1||find(link[v])) { link[v]=k; return 1; } } } return 0; } int main() { int i,j,u,v,cnt; while(scanf("%d%d",&n,&m),n||m) { memset(g,-1,sizeof(g)); memset(map,0,sizeof(map)); memset(head,-1,sizeof(head)); t=x=y=0; cnt=0; for(i=0;i<n;i++) { scanf("%d%d",&u,&v); x=max(x,u+1);y=max(y,v); if(g[u][v]==-1) { g[u][v]=cnt++; } if(g[u+1][v]==-1) { g[u+1][v]=cnt++; } add(g[u][v],g[u+1][v]); add(g[u+1][v],g[u][v]); } for(i=0;i<m;i++) { scanf("%d%d",&u,&v); x=max(x,u);y=max(y,v+1); if(g[u][v]==-1) { g[u][v]=cnt++; } if(g[u][v+1]==-1) { g[u][v+1]=cnt++; } add(g[u][v],g[u][v+1]); add(g[u][v],g[u][v+1]); } x++;y++; int ans=0; for(i=0;i<cnt;i++) { memset(mark,0,sizeof(mark)); printf("%d :",i); ans+=find(i); puts(""); } printf("%d\n",ans/2); } return 0; }
hdu 4619 Warm up 2 (二分图),布布扣,bubuko.com
标签:des style blog http color java os strong
原文地址:http://blog.csdn.net/u011721440/article/details/38338183