公牛母牛配(分圖最大匹配母題)
阿新 • • 發佈:2019-02-07
【問題背景】
n只公牛和m只母牛,
某些公牛和某些母牛互相喜歡。
但最後一隻公牛隻能和一隻母牛建立一對一匹配。
要使得最後牛群匹配對數最大。
【輸入】
第一行三個整數n, m,k( 1<= n, m <= 10000,0< k <= 100000)。
下來k行,每行兩個整數 x,y,表示一條邊,連線X集合中x點和Y集合的y點。
【輸出】
只有一行。輸出一個整數,表示牛群匹配對數最大值.
input:
5 5 9
1 2
2 2
2 3
2 5
3 1
3 3
4 1
5 3
5 4
output
5
#include <iostream> #include <cstdio> #include <vector> #include <cstring> using namespace std; const int MAXN = 10010; //點數的最大值 const int MAXM = 100010; //邊數的最大值 vector<int> G[MAXN]; void addedge(int u,int v) { G[u].push_back(v); } int linker[MAXN]; bool used[MAXN]; bool dfs(int u) { for(int i=0; i<G[u].size() ;i++) { int v=G[u][i]; if(!used[v]) //判斷v這個點是否已匹配 { used[v]=true; if(linker[v] == -1 || dfs(linker[v])) //linker判斷v這個點的連線物件 { //遞迴的時候x走到y的一個地方就順手標記了當前y。 linker[v] = u; return true; } } } return false; } int hungary(int uN) //傳入x的所有點的個數 { int res=0; memset(linker,-1,sizeof(linker)); for(int u=1;u<=uN;u++) //點的編號1~uN { memset(used,false,sizeof(used)); //每一次重新開始,就取消y中之前的標誌 if(dfs(u)) res++; } return res; } int main() { int n,m,k; int ans=0; scanf("%d%d%d",&n,&m,&k); while(k--) { int u,v; scanf("%d%d",&u,&v); addedge(u,v); } ans=hungary(n); printf("%d\n",ans); return 0; }