匈牙利算法模板题
有n门课程,每门课程可能有不同一时候间,不同一时候间的课程等价。
问不冲突的情况下最多能选多少门课。
建立二分图,一边顶点表示不同课程,还有一边表示课程的时间(hash一下)。
#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <map> #define inf 0x3f3f3f3f #define eps 1e-6 #define ll __int64 using namespace std; int mp[310][310],used[310],link[310],n,m; bool dfs(int x) { for(int i=1;i<=m;i++) { if(!used[i]&&mp[x][i]) { used[i]=1; if(link[i]==-1||dfs(link[i])) { link[i]=x; return 1; } } } return 0; } int hungry() { int res=0; memset(link,-1,sizeof link); for(int i=1;i<=n;i++) { memset(used,0,sizeof used); if(dfs(i)) res++; } return res; } int main() { int i,a,b; while(~scanf("%d",&n)) { memset(mp,0,sizeof mp); for(i=1;i<=n;i++) { scanf("%d",&m); while(m--) { scanf("%d%d",&a,&b); mp[i][(a-1)*12+b]=1; } } m=7*12; printf("%d\n",hungry()); } return 0; }
poj2239 Selecting Courses --- 二分图最大匹配,布布扣,bubuko.com
时间: 2024-10-26 03:08:29