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 }

 

 

 

你可能感兴趣的:(poj)