您的位置:首页 > 其它

hdu 1281 二分匹配

2012-07-25 19:27 561 查看
题意:

在图上给出一些点,安放车,让其不相互攻击,求车的最大值!!并求出那些点不可代替!!

构图:

将各自的x,y坐标提出了,建立边!!xi,yi边的匹配的最大值就是车的数量!!!删除每条边,如果车的数量有所减少则是不可替代的车!!

代码:
#include<iostream>
#include<cstdio>
#include<memory.h>
#include<algorithm>
using namespace std;
int vis[102],mat[102];
int n,m,k,tx,ty,x[102],y[102];
int f[1002][1002];
int find(int x)
{
for(int i=f[x][0]; i>=1; i--)
{
int y=f[x][i];
if(!vis[y])
{
if(x==tx&&y==ty) continue;
vis[y]=1;
if(mat[y]==-1||find(mat[y]))
{
mat[y]=x;
return 1;
}
}
}
return 0;
}
int main ()
{
int i,j,t;
int m,n,k,ans,cas=1;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
memset(f,0,sizeof(f));
memset(mat,-1,sizeof(mat));
ans=0;
int Max=0;
tx=-1,ty=-1;
for(i=1; i<=k; i++)
{
scanf("%d %d",&x[i],&y[i]);
f[x[i]][++f[x[i]][0]]=y[i];
}
for(i=1; i<=n; i++)
{
memset(vis,0,sizeof(vis));
if(find(i))
Max++;
}
int imp=0;
for(i=1; i<=n; i++)
{
for(t=f[i][0]; t>=1; t--)
{
memset(mat,-1,sizeof(mat));
ans=0;
tx=i;ty=f[i][t];
for(j=1; j<=n; j++)
{
memset(vis,0,sizeof(vis));
if(find(j))ans++;
}
if(ans<Max) imp++;
}

}
printf("Board %d have %d important blanks for %d chessmen.\n",cas++,imp,Max);
}
return 0;
}
/*
3 3 4
1 2
1 3
2 1
2 2
3 3 4
1 2
2 3
2 1
3 2
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: