tj
2025-09-21 16:36:30
发布于:广东
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,k;
ll mapp[309][309],maxn=-1,head[309],last[90009],to[90009],tot=1,l,r;
ll ans,match[309],vis[309];
void init()
{
memset(last,0,sizeof(last));
memset(head,0,sizeof(head));
memset(to,0,sizeof(to));
}
void add(ll x,ll y)//加边
{
tot++;
to[tot]=y;
last[tot]=head[x];
head[x]=tot;
}
bool path(ll u)
{
for(ll i=head[u];i!=0;i=last[i])//二分图匹配模板
{
ll v=to[i];
if(vis[v]1)
continue;
vis[v]=1;
if(match[v]-1||path(match[v])==true)
{
match[v]=u;
return true;
}
}
return false;
}
void slove()
{
ans=0;
memset(match,-1,sizeof(match));//match数组表示匹配量
for(ll i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(path(i)==true)
{
ans++;
}
}
}
int main()
{
cin>>n>>m>>k;
for(ll i=1;i<=n;i++)
{
for(ll j=1;j<=m;j++)
{
cin>>mapp[i][j];
maxn=max(maxn,mapp[i][j]);//maxn表示矩阵最大值
}
}
l=0,r=maxn;
while(l<=r)//二分求值
{
init(); //一定要初始化!!!
ll mid=(l+r)/2;
for(ll i=1;i<=n;i++)
{
for(ll j=1;j<=m;j++)
{
if(mapp[i][j]<mid)
{
add(i,j);
}
}
}
slove();
if(ans>n-k)
{
r=mid-1;
}
else
{
l=mid+1;
}
}
cout<<r;
return 0;
}
这里空空如也





有帮助,赞一个