標籤:os art cti for io 演算法
匈牙利演算法模板題
有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 __int64using 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;}