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

886. [USACO 4.2] 完美的牛欄

★★☆   輸入文件: stall4.in   輸出文件: stall4.out   簡單對比
時間限制:1 s   內存限制:128 MB
USACO/stall4(譯by Felicia Crazy)

描述ios

 

農夫約翰上個星期剛剛建好了他的新牛棚,他使用了最新的擠奶技術。不幸的是,因爲工程問題,每一個牛欄都不同。第一個星期,農夫約翰隨便地讓奶牛們進入牛欄,可是問題很快地顯露出來:每頭奶牛都只願意在她們喜歡的那些牛欄中產奶。上個星期,農夫約翰剛剛收集到了奶牛們的愛好的信息(每頭奶牛喜歡在哪些牛欄產奶)。一個牛欄只能容納一頭奶牛,固然,一頭奶牛隻能在一個牛欄中產奶。spa

給出奶牛們的愛好的信息,計算最大分配方案。code

 

格式blog

PROGRAM NAME: stall4內存

INPUT FORMAT:ci

(file stall4.in)get

 

第一行
兩個整數,N (0 <= N <= 200)和M (0 <= M <= 200)。N是農夫約翰的奶牛數量,M是新牛棚的牛欄數量。
第二行到第N+1行

一共N行,每行對應一隻奶牛。第一個數字(Si)是這頭奶牛願意在其中產奶的牛欄的數目(0 <= Si<= M)。後面的Si個數表示這些牛欄的編號。牛欄的編號限定在區間(1..M)中,在同一行,一個牛欄不會被列出兩次。string

 

OUTPUT FORMAT:io

(file stall4.out)table

 只有一行。輸出一個整數,表示最多能分配到的牛欄的數量。

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\n",ans);
67     fclose(stdin);
68     fclose(stdout);
69     return 0;
70 }
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息