标签:
二分图的难点主要在建图;
关于二分图的几个重要公式:
最大匹配数=最小点覆盖
最小边覆盖=顶点总数-最大匹配数/2 (这个要拆点:uN=vN=cnt,ans=cnt-hungary/2)
最大团=补图最大独立集
最大独立集=顶点数-最大匹配
匈牙利算法:
int link[maxn]; vector<int>G [maxn]; int uN,vN; bool vis[maxn]; bool dfs(int u) { for(int i=0;i<G[u].size();i++){ //取出u的下一个未访问过的点v int v=G[u][i]; if(!vis[v]){ vis[v]=1; if(link[v]==-1||dfs(link[v])){ //如果link[v]==-1或dfs(link[v]),反转:link[v]=u; link[v]=u; return true; } } } return false; } int hungary() { int res=0; memset(link,-1,sizeof(link)); //初始化link数组 for(int u=1;u<=uN;u++){ memset(vis,0,sizeof(vis)); //注意每次需初始化vis数组 if(dfs(u)) res++; } return res; }
采用vector代替邻接矩阵模拟邻接表,提高效率又不增加代码量 (其实是我还没掌握好邻接表。。)
标签:
原文地址:http://www.cnblogs.com/--560/p/4330134.html