标签:eof mem i++ 最大匹配 while poj 最大 课程 logs
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 二分图匹配(水)
标签:eof mem i++ 最大匹配 while poj 最大 课程 logs
原文地址:http://www.cnblogs.com/HIKARI1149/p/7049697.html