现掌握匈牙利算法的两种解法:一种最基本的邻接矩阵算法,还有一种邻接表算法。
邻接矩阵太简单了就不再赘述,邻接矩阵虽然简单但是算法效率较低。主要要能掌握邻接表的算法,邻接表的算法关键是进行维护一个map【max】的向量,
map[max]理解为一个二维向量,每个map【i】都对应一个节点,map【i】中存储的数据是与i相连接的节点。可以认为map【i】是二分图中的x节点,其中记录的数据为二分图中的y节点,
bool dfs(int k)
{
int i;
for(i=0;i<map[k].size();i++)//此处切忌从0出发,因为建立map时用的是push_back,只能从0读取数据;
{
int v=map[k][i];
if(!visit[v])
{
visit[i]=1;
if(match[v]||dfs(match[v]))
{
match[v]=k;
return 1;
}
}
}
return 0;
}
此算法的map不能等同理解成邻接矩阵中的map,此处的map每一行向量都是一个点,仅仅能记录一个点。
再说一下二分图中常见的一些建图方式:如果题目中明确指明有两部分关系,如:男生 女生,这样最简单,直接用邻接矩阵、邻接表做即可(另外注意,如果给出了明确的两部分关系,可是题目没有说边只给出一次、边不会重复出现等,则注意双向建边并且除2)如果题目中只给出的是一个关系。如:街道链接情况 则自己需要复制所有的点使其能够用二分建图。