题目:
有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 }