dfs版本貌似有些情况不如bfs版本
例题:https://vjudge.net/problem/Kattis-engaging
https://vjudge.net/problem/HDU-2255
const int maxn=2e3+7;
int love[maxn][maxn];
int ex_girl[maxn],ex_boy[maxn];
bool vis_girl[maxn],vis_boy[maxn];
int match[maxn];
int slack[maxn];
int nx,ny;
vector<pair<int,int> >vec;
bool dfs(int girl)
{
vis_girl[girl]=true;
for(int boy=1; boy<=ny; boy++)
{
if(vis_boy[boy])
continue;
int gap=ex_girl[girl]+ex_boy[boy]-love[girl][boy];
if(gap==0)
{
vis_boy[boy]=true;
if(match[boy]==-1||dfs(match[boy]))
{
match[boy]=girl;
return true;
}
}
else
slack[boy]=min(slack[boy],gap);
}
return false;
}
pair<int,int> KM()
{
memset(match,-1,sizeof(match));
memset(ex_boy,0,sizeof(ex_boy));
for(int i=1; i<=nx; i++)
{
ex_girl[i]=-INF;
for(int j=1; j<=ny; j++)
ex_girl[i]=max(ex_girl[i],love[i][j]);
}
for(int i=1; i<=nx; i++)
{
for(int j=1; j<=ny; j++)
slack[j]=INF;
while(true)
{
memset(vis_girl,false,sizeof(vis_girl));
memset(vis_boy,false,sizeof(vis_boy));
if(dfs(i))
break;
int d=INF;
for(int j=1; j<=ny; j++)
if(!vis_boy[j])
d=min(d,slack[j]);
for(int j=1; j<=nx; j++)
{
if(vis_girl[j])
ex_girl[j]-=d;
}
for(int j=1; j<=ny; j++)
{
if(vis_boy[j])
ex_boy[j]+=d;
else
slack[j]-=d;
}
}
}
int sum=0,num=0;
for(int i=1; i<=ny; i++)
{
if(match[i]>0)
{
sum+=love[match[i]][i];
num++;
vec.push_back(make_pair(match[i],i));
}
}
return make_pair(sum,num);
}
/*scanf n,m
如果boy的数量大于girl 可以交换 即if(n>m) swap(n,m)
调用:pair<int,int> tmp=KM();
tmp.first是权 second 是个数
ans存储答案*/
for(int i=0; i<len; i++)
{
if(flag)// 如果交换的话,应该反着输出
printf("%d %d\n",ans[i].second,ans[i].first);
else
printf("%d %d\n",ans[i].first,ans[i].second);
}