POJ 1469 COURSES(二分图匹配模板题)

来源:互联网 发布:整理照片的软件 编辑:程序博客网 时间:2024/05/21 14:08

http://poj.org/problem?id=1469

题意:给出p个科目n个同学,问是否存在一种方案,使得每个科目都有一个科代表,这个科代表不可以同时兼任多个科目。科代表只能在该科目的同学中选。

代码如下:

#include<cstdio>#include<queue>#include<vector>#include<iostream>#include<map>#include<cmath>#include<cstring>#include<algorithm>#include<set>using namespace std;#define N 305  int useif[N];int link[N];int mat[N][N];int gn, gm;int can(int t)  {      int i;      for(i = 1; i <= gm; i++)      {  if(useif[i] == 0 && mat[t][i])  {  useif[i] = 1;  if(link[i] == -1 || can(link[i]))  {  link[i] = t;  return 1;  }  }      }      return 0;  }  int MaxMatch()  {      int i, num;      num = 0;      memset(link, 0xff, sizeof(link));      for(i = 1; i <= gn; i++)      {        memset(useif, 0, sizeof(useif));         if(can(i)) num++;      }      return num;  }  int main(){int i, k, tmp, T;cin >> T;while(T--){scanf("%d%d", &gn, &gm);memset(mat, 0, sizeof(mat));for(i = 1; i <= gn; i++){scanf("%d", &k);while(k--){scanf("%d", &tmp);mat[i][tmp] = 1;}}tmp = MaxMatch();//printf("%d\n", tmp);if(tmp == gn)cout << "YES" << endl;elsecout << "NO" << endl;}return 0;}


0 0
原创粉丝点击