匈牙利算法 cogs 886. [USACO 4.2] 完美的牛栏

886. [USACO 4.2] 完美的牛栏

★★☆   输入文件:stall4.in   输出文件:stall4.out   简单对比
时间限制:1 s   内存限制:128 MB
USACO/stall4(译by Felicia Crazy)

描述

农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术。不幸的是,由于工程问题,每个牛栏都不一样。第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶。上个星期,农夫约翰刚刚收集到了奶牛们的爱好的信息(每头奶牛喜欢在哪些牛栏产奶)。一个牛栏只能容纳一头奶牛,当然,一头奶牛只能在一个牛栏中产奶。

给出奶牛们的爱好的信息,计算最大分配方案。

格式

PROGRAM NAME: stall4

INPUT FORMAT:

(file stall4.in)

第一行
两个整数,N (0 <= N <= 200)和M (0 <= M <= 200)。N是农夫约翰的奶牛数量,M是新牛棚的牛栏数量。
第二行到第N+1行

一共N行,每行对应一只奶牛。第一个数字(Si)是这头奶牛愿意在其中产奶的牛栏的数目(0 <= Si<= M)。后面的Si个数表示这些牛栏的编号。牛栏的编号限定在区间(1..M)中,在同一行,一个牛栏不会被列出两次。

OUTPUT FORMAT:

(file stall4.out)

 只有一行。输出一个整数,表示最多能分配到的牛栏的数量。

SAMPLE INPUT (file stall4.in)

5 5

2 2 5

3 2 3 4

2 1 5

3 1 2 5

1 2

SAMPLE OUTPUT (file stall4.out)

4
 1 #define N 205
 2 #include<iostream>
 3 using namespace std;
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<vector>
 7 int n,m,lin[N];
 8 vector<int>edge[N];
 9 bool vis[N];
10 int read()
11 {
12     int ret=0,ff=1;
13     char s=getchar();
14     while(s<'0'||s>'9')
15     {
16         if(s=='-') ff=-1;
17         s=getchar();
18     }
19     while(s>='0'&&s<='9')
20     {
21         ret=ret*10+s-'0';
22         s=getchar();
23     }
24     return ret;
25 }
26 void inpu()
27 {
28     n=read();m=read();
29     int s,x;
30     for(int i=1;i<=n;++i)
31     {
32         s=read();
33         for(int j=1;j<=s;++j)
34         edge[i].push_back(read());
35     }
36 }
37 bool xylfind(int k)
38 {
39     int siz=edge[k].size();
40     for(int i=0;i<siz;++i)
41     {
42         int v=edge[k][i];
43         if(!vis[v])
44         {
45             vis[v]=true;
46             if(!lin[v]||xylfind(lin[v]))
47             {
48                 lin[v]=k;
49                 return true;
50             }
51         }
52     }
53     return false;
54 }
55 int main()
56 {
57     freopen("stall4.in","r",stdin);
58     freopen("stall4.out","w",stdout);
59     inpu();
60     int ans=0;
61     for(int i=1;i<=n;++i)
62     {
63         memset(vis,0,sizeof(vis));
64         if(xylfind(i)) ans++;
65     }
66     printf("%d
",ans);
67     fclose(stdin);
68     fclose(stdout);
69     return 0;
70 }
原文地址:https://www.cnblogs.com/c1299401227/p/6064236.html