poj2239 Selecting Courses解题报告
2012-07-05 23:20
211 查看
题目意思:
一天12节课,一个星期七天。有n中课程,每种课程只要上m[i]节课的一节就可以了,求最多能上多少节课?
解题思路:这是一道典型的求二分图的最大匹配问题,用匈牙利算法解决。
代码:
#include<iostream>
using namespace std;
int a[500][100],match[500],n,m=84,che[500];
int dfs(int k)
{
int i,t;
for(i=1;i<=m;i++)
{
if(!che[i]&&a[k][i])
{
t=match[i];match[i]=k;che[i]=1;
if(t==-1||dfs(t)) return 1;
match[i]=t;
}
}
return 0;
}
int maxflow()
{
int i,ans=0;
for(i=1;i<=n;i++)
{
memset(che,0,sizeof(che));
if(dfs(i)) ans++;
}
return ans;
}
int main()
{
int i,j,k,d,c;
while(cin>>n)
{
memset(a,0,sizeof(a));
memset(match,-1,sizeof(match));
for(i=1;i<=n;i++)
{
cin>>k;
for(j=0;j<k;j++)
{
cin>>d>>c;
a[i][(d-1)*12+c]=1;
}
}
cout<<maxflow()<<endl;
}
return 0;
}
一天12节课,一个星期七天。有n中课程,每种课程只要上m[i]节课的一节就可以了,求最多能上多少节课?
解题思路:这是一道典型的求二分图的最大匹配问题,用匈牙利算法解决。
代码:
#include<iostream>
using namespace std;
int a[500][100],match[500],n,m=84,che[500];
int dfs(int k)
{
int i,t;
for(i=1;i<=m;i++)
{
if(!che[i]&&a[k][i])
{
t=match[i];match[i]=k;che[i]=1;
if(t==-1||dfs(t)) return 1;
match[i]=t;
}
}
return 0;
}
int maxflow()
{
int i,ans=0;
for(i=1;i<=n;i++)
{
memset(che,0,sizeof(che));
if(dfs(i)) ans++;
}
return ans;
}
int main()
{
int i,j,k,d,c;
while(cin>>n)
{
memset(a,0,sizeof(a));
memset(match,-1,sizeof(match));
for(i=1;i<=n;i++)
{
cin>>k;
for(j=0;j<k;j++)
{
cin>>d>>c;
a[i][(d-1)*12+c]=1;
}
}
cout<<maxflow()<<endl;
}
return 0;
}
相关文章推荐
- 【POJ1182】食物链,思路+数据+代码,可能是史上关于这道题最详细的解题报告
- POJ 3299(湿润指数 简单数学) 解题报告
- POJ 1163 The Triangle 解题报告
- POJ 1045 解题报告
- POJ 1214 解题报告
- LA-3883 & POJ-3518 Prime Gap 解题报告
- POJ 3580 较复杂的Splay区间维护题解题报告
- POJ 虫子的生活 解题报告 (种类并查集)
- POj 1105解题报告
- POJ 2362 POJ1011解题报告
- poj解题报告——1970
- POJ 1003解题报告
- poj 1046 Color Me Less 解题报告
- POJ 1001 Exponentiation解题报告
- poj 2312解题报告
- 解题报告: POJ_2955 Brackets DP
- POJ-3087 Shuffle'm Up 解题报告(陈小宾)
- Poj 1654 Area 计算面积 解题报告
- POJ_1321 棋盘问题解题报告
- POJ 2159 解题报告