Smile

Smile

常用链接

统计

最新评论

最大二分匹配 邻接矩阵实现

第1行3个整数,V1,V2的节点数目n1,n2,G的边数m
第2-m+1行,每行两个整数t1,t2,代表V1中编号为t1的点和V2中编号为t2的点之间有边相连   
输出格式:   1个整数ans,代表最大匹配数
#include <stdio.h>
#include <string.h>
int n1, n2, m, ans;
int result[101]; //记录V2中的点匹配的点的编号
bool state [101]; //记录V2中的每个点是否被搜索过
bool data[101][101];//邻接矩阵 true代表有边相连

void init()
{
    int t1, t2;
    memset(data, 0, sizeof(data));
    memset(result, 0, sizeof(result));
    ans = 0;
    scanf("%d%d%d", &n1, &n2, &m);
    for (int i = 1; i <= m; i++)
    {
       scanf("%d%d", &t1, &t2);
       data[t1][t2] = true;
    }
    return;
}

bool find(int a)
{
    for (int i = 1; i <= n2; i++)
    {
       if ( data[a][i] == 1 && !state[i] ) //如果节点i与a相邻并且未被查找过
       {
           state[i] = true; //标记i为已查找过
           if ( result[i] == 0 //如果i未在前一个匹配M中
           || find( result[i] ) ) //i在匹配M中,但是从与i相邻的节点出发可以有增广路
           {
                result[i] = a; //记录查找成功记录
                return true; //返回查找成功
           }
       }
    }
    return false;
}

int main()
{
    init();
    for (int i = 1; i <= n1; i++)
    {
        memset(state, 0, sizeof(state)); //清空上次搜索时的标记
        if ( find(i) ) ans++; //从节点i尝试扩展
    }   
    printf("%d\n", ans);
    return 0;
}

posted on 2011-07-15 21:11 Smile3 阅读(220) 评论(0)  编辑 收藏 引用 所属分类: 模板