二分圖匹配——匈牙利演算法

來源:互聯網
上載者:User

標籤:cstring   pre   情況   演算法   scanf   targe   mat   std   整數   

日常吐槽:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈今天是這麼久以來唯一一次大爽(?)的日子。我,趙·機智·小機靈鬼兒用十分鐘AC了XXX模板!掌聲鼓勵!

思路照樣見XXX部落格 70175814 反正小機靈鬼兒只是來貼代碼的

例題

洛穀P3386 【模板】二分圖匹配

題目背景

二分圖

題目描述

給定一個二分圖,結點個數分別為n,m,邊數為e,求二分圖最大匹配數

輸入輸出格式

輸入格式:

第一行,n,m,e

第二至e+1行,每行兩個正整數u,v,表示u,v有一條連邊

輸出格式:

共一行,二分圖最大匹配

輸入輸出範例

輸入範例#1: 
1 1 11 1
輸出範例#1: 
1

說明

n, m小於等於 1000,u和v分別為小於n、m的正整數。

因為資料有坑,可能會遇到 v>m 的情況。請把 v>m 的資料自覺過濾掉。

代碼

#include<cstdio>#include<iostream>#include<cstring>using namespace std;int n, m, p, tot = 0, ans = 0;int a[1001], b[1001], t[1001][1001], vis[1001];int dfs(int u){    for (int v = 1; v <= m; v++)        if (t[u][v] && !vis[v])        {            vis[v] = 1;            if (!b[v] || dfs(b[v]))            {                a[u] = v;                b[v] = u;                return 1;            }        }    return 0;}void maxmatch(){    for (int i = 1; i <= n; i++)        if (!a[i])        {            memset(vis, 0, sizeof vis);            ans += dfs(i);        }    printf("%d\n", ans);}int main(){    memset(a, 0, sizeof a);    memset(b, 0, sizeof b);    memset(t, 0, sizeof t);    scanf("%d%d%d", &n, &m, &p);    for (int i = 1; i <= p; i++)    {        int x, y;        scanf("%d%d", &x, &y);        if (x > n || y > m) continue;        tot++;        t[x][y] = 1;    }    maxmatch();    return 0;}

 

二分圖匹配——匈牙利演算法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.