指派问题 --二分图匹配

题目:

  有N台计算机和k个任务,我们可以给每台计算机分配一个任务,每台计算机能够处理的任务种类各不相同,请求出最多能够处理任务的个数;

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 const int MAXN=1000;
 5 int uN,vN;  //u,v数目
 6 int g[MAXN][MAXN];//编号是0~n-1的
 7 int linker[MAXN];//表示b集合中的i匹配到a集合的元素 a集合代表机器b集合代表任务
 8 bool used[MAXN];//b集合被访问
 9 bool dfs(int u) //给第u台机器分配任务
10 {
11     int v;
12     for(v=1;v<=vN;v++)
13         if(g[u][v]&&!used[v])
14         {
15             used[v]=true;
16             if(linker[v]==-1||dfs(linker[v]))//当任务v被占领时,把占领v任务的机器给重新分配任务,即dfs(linker[v])
17             {
18                 linker[v]=u;
19                 return true;
20             }
21         }
22     return false;
23 }
24 int hungary()
25 {
26     int res=0;
27     int u;
28     memset(linker,-1,sizeof(linker));
29     for(u=1;u<=uN;u++)
30     {
31         memset(used,0,sizeof(used));
32         if(dfs(u))  res++;
33     }
34     return res;
35 }
36 int main(){
37 
38 int n,m;
39 while(cin>>n>>m)
40 {uN=n;vN=m;
41 int x,y;
42     for(int i=1;i<=n;i++)
43     {
44         cin>>x;
45         while(x--)
46         {
47             cin>>y;
48             g[i][y]=1;
49         }
50     }
51 
52    cout<<hungary()<<endl;
53 
54 }
55 
56 return 0;
57 
58 }
原文地址:https://www.cnblogs.com/WDKER/p/5488751.html