1、poj 2239 Selecting Courses 二分图最大匹配问题
2、总结:看到一个题解,直接用三维数组做的,很巧妙,很暴力。。
题意:N种课,给出时间,每种课在星期几的第几节课上,求最多可上几种课。
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int mapn[310][10][15]; int visit[10][15],pipei[10][15]; int findn(int n) { for(int i=1;i<=7;i++){ for(int j=1;j<=12;j++){ if(!visit[i][j]&&mapn[n][i][j]){ //这个时间点[i][j]要能够和n匹配 visit[i][j]=1; if(!pipei[i][j]||findn(pipei[i][j])){ //如果这个时间点没有和其它课匹配,或者已经匹配了但其它课可以换其它时间点。也就是不冲突 pipei[i][j]=n; return 1; } } } } return 0; } int main() { int n,t,p,q; while(scanf("%d",&n)!=EOF) { memset(mapn,0,sizeof(mapn)); for(int i=1;i<=n;i++){ scanf("%d",&t); while(t--){ scanf("%d%d",&p,&q); mapn[i][p][q]=1; } } memset(pipei,0,sizeof(pipei)); int sum=0; for(int i=1;i<=n;i++){ memset(visit,0,sizeof(visit)); if(findn(i)){ //查找每种课是否都能匹配不冲突的上课时间 sum++; } } printf("%d ",sum); } return 0; }