一直寻找二分图中是否存在着交错链,如果存在,则使匹配的数目增1.
交错链开始于左部,也结束于左部。路径长度为奇数,第1条和最后一条线段都不属于匹配。这样,如果存在交错链则肯定存在另一个匹配比原先的匹配长度多1.
flag代表是否当前点已经被访问过,link代表构成交错链以后点的前驱
bool source[110][310],flag[310];
int _link[310],p,n;
bool find(int a)
{
int i,j,k;
for(i=1;i<=n;i++)
{
if(source[a][i]==1&&flag[i]==0)
{
flag[i]=1;
if(_link[i]==0||find(_link[i]))
{
_link[i]=a;
return true;
}
}
}
return false;
}
int main()
{
输入source;mount=0;
for(i=1;i<=p;i++)
{
memset(flag,0,sizeof(flag));
if(find(i))mount++;
}
cout<<mount<<endl;
}
交错链开始于左部,也结束于左部。路径长度为奇数,第1条和最后一条线段都不属于匹配。这样,如果存在交错链则肯定存在另一个匹配比原先的匹配长度多1.
flag代表是否当前点已经被访问过,link代表构成交错链以后点的前驱
bool source[110][310],flag[310];
int _link[310],p,n;
bool find(int a)
{
int i,j,k;
for(i=1;i<=n;i++)
{
if(source[a][i]==1&&flag[i]==0)
{
flag[i]=1;
if(_link[i]==0||find(_link[i]))
{
_link[i]=a;
return true;
}
}
}
return false;
}
int main()
{
输入source;mount=0;
for(i=1;i<=p;i++)
{
memset(flag,0,sizeof(flag));
if(find(i))mount++;
}
cout<<mount<<endl;
}