POJ 2239 Selecting Course 二分图匹配(水)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2239 Selecting Course 二分图匹配(水)相关的知识,希望对你有一定的参考价值。
http://poj.org/problem?id=2239
题意:总共7天,每天有12个教室使用,每门课有(t,pi,qi) 表示该门课每周开t次
在第qi天,第pi间教室i=1..t 总共n门课 n<=300,问最多能选多少种不同的课程?
左边点为课程 右边点为(p,q) 把(p,q)看成排列中的序数 化成整数(p-1)*12+q.
求二分图的最大匹配即可 复杂度为O(nm)
#include <iostream> #include <cstring> #include <cstdio> using namespace std; typedef long long ll; const int N=3e2+20; const int M=3e4; int n,m; int linker[M],vis[M]; int g[N][M]; bool dfs(int u) { for(int i=1;i<=m;i++) { if(g[u][i]&&vis[i]==0) { vis[i]=1; //u-i ·??¥??±? i-linker[i]?a?¥??±? //?òμ?·??¥??μ??ò??×??¥??±? if(linker[i]==-1||dfs(linker[i])) { linker[i]=u; return true; } } } return false; } int Hungary() { int res=0; int u; memset(linker,-1,sizeof(linker)); for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) res++; } return res; } int main() { while(cin>>n) { int u,v,t; m=7*12; memset(g,0,sizeof(g)); for(int i=1;i<=n;i++) { cin>>t; for(int j=1;j<=t;j++) { cin>>u>>v; g[i][(u-1)*12+v]=1; } } int ans=Hungary(); cout<<ans<<endl; } return 0; }
以上是关于POJ 2239 Selecting Course 二分图匹配(水)的主要内容,如果未能解决你的问题,请参考以下文章
POJ2239-Selecting Courses-(匈牙利算法)