您的位置:首页 > 其它

几道二分匹配

2012-07-18 18:25 155 查看
额,累死了,,快十天了没更新博客啦,这些天一直在做二分匹配,截止到刚才终于把hdu Index By Type里面的match做完啦。。好吧,一题一题开始说。
http://acm.hdu.edu.cn/showproblem.php?pid=2236
无题II

一般遇到使最大最小差值最小的问题,要想到二分答案,然后枚举下限,对于每一种情况判断是否可行。

因为每行没列都选一个,所以用到二分匹配,行在A中,列在B中,这样每一个数都代表从A到B的一条边。

然后判断在这样的一种情况下,能否找得到一组完备匹配。

View Code

# include<stdio.h>
# include<string.h>
# include<stdlib.h>
# define N 1005
# define M 505
int n,m,mid;
int used[M]
,Num[M];
bool vis[M],map
[M];
bool getnum(int u)
{
int j,v;
for(j=0;j<m;j++)
{
v=j;
if(!map[u][v]) continue;
if(vis[v]) continue;
vis[v]=1;
if(Num[v]<mid)
{
Num[v]++;
used[v][Num[v]]=u;
return 1;
}
for(j=1;j<=Num[v];j++)
{
if(getnum(used[v][j]))
{
used[v][j]=u;
return 1;
}
}
}
return 0;
}
int main()
{
int i,j;
int flag,num,ans;
int l,r;
char str[20000];
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0 && m==0) break;
memset(map,0,sizeof(map));
for(i=0;i<n;i++)
{
scanf("%s",str);
gets(str);
flag=0;
for(j=0;str[j];j++)
{
if(str[j]>='0' && str[j]<='9' && flag==0)
{
num=str[j]-'0';
flag=1;
}
else if(str[j]>='0' && str[j]<='9')
{
num*=10;
num+=str[j]-'0';
}
else if(str[j]==' ')
{
if(flag==1) map[i][num]=1;
flag=0;
}
}
if(flag==1) map[i][num]=1;
}
l=n/m;
if(l*m!=n) l++;
r=n;
while(l<=r)
{
mid=(l+r)/2;
memset(Num,0,sizeof(Num));
for(i=0;i<n;i++)
{
memset(vis,0,sizeof(vis));
if(!getnum(i)) break;
}
if(i==n) {ans=mid;r=mid-1;}
else l=mid+1;
}
printf("%d\n",ans);
}
return 0;
}


http://acm.hdu.edu.cn/showproblem.php?pid=2413

Against Mammoths

我也是用二分答案做的,但是有一组例子都跑不出来。。。

1 1

0 40000 40000 39999

40000

结果应该是1600040000。

难道是我水过了????
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: