POJ 2239 简单的二分图求最大匹配

题意:

给出n个可选课程..

给出第 i 个课程分布所在的课程表个数 t 和位置 (p, q)..

P.S. :一个星期有7天..一天有12道题.. 然后看成一条线..

思路:

把 课程 和 分配时间 作为两个集合..

然后看作求二分图的最大匹配..

Tips:

分配时间转变成 p*12+q

Code:

View Code
 1 #include <stdio.h>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 #define clr(x) memset(x, 0, sizeof(x))
 6 
 7 struct Edge
 8 {
 9     int to;
10     int next;
11 }edge[10000000];
12 int tot;
13 int head[310];
14 
15 void add(int s, int u)
16 {
17     edge[tot].to = u;
18     edge[tot].next = head[s];
19     head[s] = tot++;
20 }
21 
22 int link[310];
23 int vis[110];
24 int m, n;
25 
26 int dfs(int x)
27 {
28     for(int i = head[x]; i != 0; i = edge[i].next){
29         int y = edge[i].to;
30         if(!vis[y]){
31             vis[y] = true;
32             if(link[y] == 0 || dfs(link[y])){
33                 link[y] = x;
34                 return true;
35             }
36         }
37     }
38     return false;
39 }
40 
41 void solve()
42 {
43     for(int i = 1; i <= n; ++i){
44         clr(vis);
45         if(dfs(i))
46             m++;
47     }
48 }
49 
50 int main()
51 {
52     int i, j, k;
53     int t, p, q;
54     int sum;
55     while(scanf("%d", &n) != EOF)
56     {
57         tot = 1;
58         m = 0;
59         clr(head);
60         clr(link);
61 
62         for(i = 1; i <= n; ++i){
63             scanf("%d", &t);
64             while(t--){
65                 scanf("%d %d", &p, &q);
66                 add(i, p*12+q);
67             }
68         }
69 
70         solve();
71 
72         printf("%d\n", m);
73 
74 
75     }
76     return 0;
77 }

 

 

 

posted @ 2012-09-05 12:13  Griselda.  阅读(188)  评论(0编辑  收藏  举报