二分图的一些细节

现掌握匈牙利算法的两种解法:一种最基本的邻接矩阵算法,还有一种邻接表算法。

邻接矩阵太简单了就不再赘述,邻接矩阵虽然简单但是算法效率较低。主要要能掌握邻接表的算法,邻接表的算法关键是进行维护一个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)如果题目中只给出的是一个关系。如:街道链接情况 则自己需要复制所有的点使其能够用二分建图。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值