摘要: 二分图判定+最大匹配(匈牙利算法)解答看 hrbeu 哈工程The Accomodation of Students 阅读全文
posted @ 2012-11-26 23:47 Titanium 阅读(109) 评论(0) 推荐(0) 编辑
摘要: 经典题目,HDU上也有,给定一个无向图,先判断是否为二分图,不是输出No,是的话,输出最大匹配,算是一个模板题1.一个图不存在奇环则是二分图2.二分图最大匹配用匈牙利算法#include <cstdio>#include <cstring>#define N 210int g[N][N]; //无向图领接表int mat[N],cov[N],vis[N],c[N];int n,m;void input(){ memset(g,0,sizeof(g)); for(int i=1; i<=m; i++) { int u,v; scanf("%d%d" 阅读全文
posted @ 2012-11-26 23:45 Titanium 阅读(273) 评论(0) 推荐(0) 编辑
摘要: 题意:就6种型号的衣服,然后给你n件衣服,n一定是6的倍数,也就是每种类型的衣服的件数是一样的,然后给m个人,每个人能穿两种型号的衣服,给你每个人穿衣的信息,然后判断是否每个人都能找到衣服穿很显然是二分图最大匹配,但是这里有个小问题,就是一种衣服有多件,可能被多个人穿,和二分图匹配有点不同,在最大匹配中每个点是只会出现一次的,这个问题要解决不难就是把相同的衣服拆成多件不同的衣服处理,但是建图的时候就要注意多处理一下,建图完毕后就是纯粹的匈牙利算法//问题一看就是二分图匹配,不过一个种衣服会有多件要怎么处理呢,就把多件相同类型的衣服当做不同衣服来处理//衣服按照1到6编号,如果第i种衣服有重复的 阅读全文
posted @ 2012-11-26 22:42 Titanium 阅读(584) 评论(0) 推荐(0) 编辑
摘要: 其实所谓的“反色”就是改变mat的标记,mat其实不是叫路径(当然在增广的过程中)它的确起到了“记录前驱”的作用,但是,每趟增广之后,其实他代表的就是匹配例如 1和6匹配 那么mat[1]=6; mat[6]=1; 它不是前驱的作用所以严格来讲,增广的过程,是回到它之前的匹配点mat[i],然后要mat[i]重新找一个匹配点,只要能找到一个就立即记录并返回不要再找了,如果这个找不到了,那么其实已经找不到增广路了所以对于一个新的起点A,它一定能找到一个匹配点B(除非它是一个孤立点一条边都没有),如果还没有被匹配过,那么它就据为己有,如果已经被匹配了,那么它还是据为己有,并且强行要求B之前的匹配. 阅读全文
posted @ 2012-11-26 21:21 Titanium 阅读(204) 评论(0) 推荐(0) 编辑