【算法小总结】二分图最大匹配的非递归方法

二分图最大匹配的非递归方法

 

代码:

#define SIZE 100

int mat[SIZE][SIZE]; /*图矩阵*/

int match1[SIZE];
int match2[SIZE];

int queue[SIZE];
int head,tail;

int pre[SIZE];

int maxMatch(int N){
    int ret = 0;
    memset(match1,-1,sizeof(match1));
    memset(match2,-1,sizeof(match2));

    for(int i=0;i<N;i++){
        memset(pre,-1,sizeof(pre));
        head = tail = 0;
        queue[tail++] = i;
        while(head < tail && match1[i]==-1){
            int u = queue[head++];
            for(int j =0;j<N&&match1[i]==-1;j++)
                if(mat[u][j] && pre[j]==-1){
                    queue[tail++] = match2[j];
                    pre[j]=u;
                    if(queue[tail-1]<0){
                        for(int t=j,k=0;t>=0;j=t){
                            match2[j]=k=pre[j];
                            t=match1[k];
                            match1[k]=j;
                        }
                    }
                }
        }
    }
}
时间: 2024-10-01 10:19:02

【算法小总结】二分图最大匹配的非递归方法的相关文章

二分图最大匹配

一.理论准备         这两天看到了图论的二部图,闲着没事就水了一道.         先看增广路的定义:增广路,也称增广轨或交错轨: 若P是图G中一条连通两个未匹配顶点的路径,并且属于M的边和不属于M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径.         由增广路的定义可以推出下述三个结论: P的路径长度必定为奇数,第一条边和最后一条边都不属于M. 不断寻找增广路可以得到一个更大的匹配M',直到找不到更多的增广路,M为G的最大匹配当且仅当不存在M的增

PHP二分查找算法示例【递归与非递归方法】_php技巧

本文实例讲述了PHP二分查找算法.分享给大家供大家参考,具体如下: binarySearch 二分查找采用的方法比较容易理解,以数组为例: ① 先取数组中间的值floor((low+top)/2), ② 然后通过与所需查找的数字进行比较,若比中间值大,则将首值替换为中间位置下一个位置,继续第一步的操作:若比中间值小,则将尾值替换为中间位置上一个位置,继续第一步操作 ③ 重复第二步操作直至找出目标数字 比如从1,3,9,23,54 中查找数字23, 首位置为0, 尾位置为4,中间位置就为2 值为9

【算法小总结】二分图的最大独立集

如果一个图是二分图,那么它的最大独立集就是多项式时间可以解决的问题了 |最大独立集| = |V|-|最大匹配数| 证明: 设最大独立集数为U,最大匹配数为M,M覆盖的顶点集合为EM. 为了证明|U|=|V|-|M|,我们分两步证明|U|<=|V|-|M|和|U|>=|V|-|M| 1 .先证明 |U|<=|V|-|M| M中的两个端点是连接的,所有M中必有一个点不在|U|集合中,所以|M|<=|V|-|U| 2. 再证明|U|>=|V|-|M| 假设(x,y)属于M 首先我们

二分图最大匹配值的模板

/* ************************************************************************** //二分图匹配(匈牙利算法的DFS实现) //初始化:g[][]两边顶点的划分情况 //建立g[i][j]表示i->j的有向边就可以了,是左边向右边的匹配 //g没有边相连则初始化为0 //uN是匹配左边的顶点数,vN是匹配右边的顶点数 //调用:res=hungary();输出最大匹配数 //优点:适用于稠密图,DFS找增广路,实现简洁易于

百度出新算法小站长该如何面对

百度新出的绿萝算法是一种搜索引擎反作弊的算法.该算法主要打击超链中介.出卖链接.购买链接等超链作弊行为.我觉得百度新推出绿萝算法还是不错的,能够使网络信息进一步的得到安全,有效的防护.对于网站来说,用户才是上帝.网站就是尽一切的能力去维护用户的利益.百度这一新出的绿萝算法就是为了维护用户的利益.让用户可以少收到一些垃圾信息. 百度新出的绿萝算法虽然给一些小站长来了个错手不及.但也进一步要求一些小站长要想办好自己的网站靠小窍门是没有用的,最重要的还是要靠实力.实力才是硬道理.如果没有实力就会被百度

蚁群算法小程序(C/C++语言实现)(一)

算法解释: 程序开始运行,蚂蚁们开始从窝里出动了,寻找食物:他们会顺着屏幕爬满整个画面,直到找到食物再返回窝. 其中,'F'点表示食物,'H'表示窝,白色块表示障碍物,'+'就是蚂蚁了. 预期的结果:各个蚂蚁在没有事先告诉他们食物在什么地方的前提下开始寻找食物.当一只找到食物以后,它会向环境释放一种信息素,吸引其他的蚂蚁过来,这样越来越多的蚂蚁会找到食物!有些蚂蚁并没有象其它蚂蚁一样总重复同样的路,他们会另辟蹊径,如果令开辟的道路比原来的其他道路更短,那么,渐渐,更多的蚂蚁被吸引到这条较短的路上

数据结构算法-菜鸟问,二叉树的非递归遍历问题

问题描述 菜鸟问,二叉树的非递归遍历问题 二叉树的非递归遍历跟着代码走一遍可以看懂是怎么实现的,想问一下利用栈非递归实现遍历是怎么想到的,代码是怎么来的呢 解决方案 我理解你的问题,意思是想问二叉树遍历是怎么出来这种算法的?,这是一个叫哈弗曼的人首先提出的二叉树概念,你要是想追溯本源就去了解他.. 我觉得学算法,_最主要就是要瞄准算法怎么解决问题,而不是去讨论起源,_ 就好比牛顿发现了行星轨道之间运转的规律--万有引力,,但是并不清楚为啥是遵循这样运动的.... 解决方案二: 我觉得你应该先把二

【算法小总结】拓扑排序+例题解析

题目1449:确定比赛名次 时间限制:1 秒内存限制:128 兆特殊判题:否提交:669解决:293 题目描述: 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前.现在请你编程序确定排名. 输入: 输入有若干组,每组中的第一行为二个数N(1<=N<=500),M:其中N表示队伍

【算法小总结】最大连续子序列和最大连续子矩阵的关系与实现

最大连续子序列和最大连续子矩阵的关系与实现   求最长连续子序列的优化方法(非DP) //求最大连续子序列和与对应的开头元素和结束元素 实现代码: #include<stdio.h> #include<string.h> #include<algorithm> #include<limits.h> #define MAXN 100002 using namespace std; int main() { int i,j,n,a[MAXN],Max,sum,m