POJ 2239 简单的二分图求最大匹配
题意:
给出n个可选课程..
给出第 i 个课程分布所在的课程表个数 t 和位置 (p, q)..
P.S. :一个星期有7天..一天有12道题.. 然后看成一条线..
思路:
把 课程 和 分配时间 作为两个集合..
然后看作求二分图的最大匹配..
Tips:
分配时间转变成 p*12+q
Code:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }