二分图 染色法 + 匈牙利算法

染色法判断二分图

const int N = 1e5 + 10, M = 2 * N;int e[M], ne[M], h[N], n, m, idx = 0, color[N];
void add(int a, int b){e[idx] = b; ne[idx] = h[a]; h[a] = idx++;}

bool dfs(int u, int c)
{
    color[u] = c;           // 染色该点
    for(int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if(color[j] == 0)
        {                   // 染色其连通点,如果存在染色矛盾,立即返回false
            if(dfs(j, 3 - c) == false)
                return false;
        }                   // 发生颜色矛盾,连通点的颜色相同
        else if(color[j] == c)
            return false;
    }
    return true;            // 对连通点的染色过程未发生矛盾
}

int main()
{
    fill(h, h + N, -1);
    cin >> n >> m;
    while(m--)
    {
        int a, b;
        cin >> a >> b;
        add(a, b);
        add(b, a);
    }
    
    bool flag = true;
    for(int i = 1; i <= n; ++i)
    {
        if(color[i] == 0)
            flag = dfs(i, 1); 
        if(flag == false)
            break;
    }
    if(flag)
        cout << "Yes";
    else
        cout << "No";
    return 0;
}

匈牙利算法求二分图最大匹配

const int N = 510, M = 1e5 + 10;
int n1, n2, m, h[N], e[M], ne[M], idx = 0;
int match[N];
bool visited[N];
void add(int a, int b){e[idx] = b; ne[idx] = h[a]; h[a] = idx++;}

int find(int u)
{
    for(int v = h[u]; v != -1; v = ne[v])
    {
        int j = e[v];
        if(visited[j] == false)
        {                           // 若j已有匹配,试找与其匹配的点
            visited[j] = true;      // 是否还有其他相连通且未发生匹配的点
            if(match[j] == 0 || find(match[j]))
            {
                match[j] = u;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    fill(h, h + N, -1);
    cin >> n1 >> n2 >> m;
    while(m--)
    {
        int a, b;
        cin >> a >> b;
        add(a, b);
    }
    
    int ret = 0;
    for(int i = 1; i <= n1; ++i)
    {
        fill(visited, visited + N, false);  // 每次查询一个点的匹配,都要置空
        if(visited[i] == false)             // match保证了已匹配的点的状态
        {
            if(find(i))
                ret++;
        }
    }
    cout << ret;
    return 0;
}

你可能感兴趣的:(算法,图论,深度优先)