#include<bits/stdc++.h>
using namespace std;
const int maxn=505;
int mp[maxn][maxn],g[maxn*2][maxn*2],n,m,used[2*maxn],link[maxn*2],cnt,nb[maxn*maxn];
map<int,int> vis;
bool found(int x)
{
for(int i=n+1;i<=2*n;i++)
{
if(g[x][i]&&!used[i])
{
used[i]=1;
if(link[i]==0||found(link[i]))
{
link[i]=x;
return true;
}
}
}
return false;
}
int del()
{
int sum=0;
for(int i=1;i<=n;i++)
{
memset(used,0,sizeof(used));
if(found(i))
sum++;
}
return sum;
}
bool check(int num)
{
memset(link,0,sizeof(link));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(mp[i][j]&&mp[i][j]>=num)
g[i][n+j]=1;
else
g[i][n+j]=0;
int sum=0;
for(int i=1;i<=n;i++)
{
memset(used,0,sizeof(used));
if(found(i))
sum++;
}
return sum>=m;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&mp[i][j]);
if(mp[i][j])
{
g[i][n+j]=1;
if(!vis[mp[i][j]])
{
vis[mp[i][j]]=1;
nb[cnt++]=mp[i][j];
}
}
}
m=del();
sort(nb,nb+cnt);
int l=0,r=cnt-1,mid;
while(l<r)
{
mid=(l+r+1)>>1;
if(check(nb[mid]))
l=mid;
else
r=mid-1;
}
printf("%d\n",nb[l]);
return 0;
}
2018年山东省ACM省赛B题 二分+二分图匹配
最新推荐文章于 2021-05-24 23:14:57 发布