POJ2239-Selecting Courses-(匈牙利算法)
Posted shoulinniao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ2239-Selecting Courses-(匈牙利算法)相关的知识,希望对你有一定的参考价值。
题意:n门课,每门各自有t个开课时间,在不冲突的情况下选最多课。
题解:把周p第q节课转化为数值sum,表示在一周7*12节课中排第几节,用二分图最大匹配。
#include<stdio.h> #include<iostream> #include<algorithm> #include<cstring> #include<math.h> #include<string> #include<map> #include<queue> #include<stack> #include<set> #define ll long long #define inf 0x3f3f3f3f using namespace std; int n,m; vector<int>a[305]; bool vis[7*12+15]; int par[7*12+15]; bool dfs(int x) int len=a[x].size(); for(int i=0;i<len;i++) int next=a[x][i]; if( !vis[next] ) vis[next]=true; if( !par[next] || dfs( par[next] ) )///next未被选中 或者 选next的那门课有别的时间段可以选 par[next]=x;///next这个时间段被第x门占用了 return true; return false; int main() while(scanf("%d",&n)!=EOF) memset(par,0,sizeof(par));///清空操作 for(int i=1;i<=n;i++) a[i].clear(); for(int i=1;i<=n;i++) scanf("%d",&m); while(m--) int p,q,sum; scanf("%d%d",&p,&q); sum=p*12+q;///在一周7*12节课中排第几节 a[i].push_back(sum); int ans=0; for(int i=1;i<=n;i++) memset(vis,false,sizeof(vis)); if(dfs(i)) ans++; printf("%d\n",ans); return 0;
以上是关于POJ2239-Selecting Courses-(匈牙利算法)的主要内容,如果未能解决你的问题,请参考以下文章
POJ2239-Selecting Courses-(匈牙利算法)