Date: 2019-9-6
Author: ZLR
Problem: POJ-1469
Degree: ※
Algorithm: Topological sort
题意:
N个学生,P个课
一个学生至少有一节喜欢的课
每门课只能一个人上
求最大的上课人数
一眼就看出来是二分图了,裸题
思路:
注意这是单向图,
一个二位数组,来存储A集合与B集合之间哪些元素有关系(A->B的关系)
具体来说就是哪个学生喜欢哪个课
两个一维数组,used数组配合查询使用,既每个学生在自己喜欢的课当中(尝试寻找增广路),找到了就用nxt数组来关联当前喜欢这节课的人是谁!
#include<cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#define maxn 310
using namespace std;
int line[maxn][maxn],used[maxn],nxt[maxn];
int man,women;
int Find(int x)
{
for(int i=1;i<=women;i++){
if(line[x][i]&&!used[i]){
used[i]=1;
if(nxt[i]==0||Find(nxt[i])){nxt[i]=x;return true;}
}
}
return false;
}
int main()
{
int t;
int x1,x2;
cin>>t;
int n,p,x,b;
while(t--)
{ cin>>p>>n;
man=p;
women=n;
memset(line,0,sizeof(line));
memset(nxt,0,sizeof(nxt));
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
while(x--)
{scanf("%d",&b);
line[i][b]=1;
}
}
int sum=0;
for(int i=1;i<=man;i++){
memset(used,0,sizeof(used));
if(Find(i))
sum++;
}
if(sum==p)
{
printf("YES\n");
}
else
printf("NO\n");
}
return 0;}
类似的模板题有一大堆,建议多做做