标签: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