Link:http://poj.org/problem?id=1469
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 17863 | Accepted: 7042 |
Description
- every student in the committee represents a different course (a student can represent a course if he/she visits that course)
- each course has a representative in the committee
Input
P N
Count1 Student 1 1 Student 1 2 ... Student 1 Count1
Count2 Student 2 1 Student 2 2 ... Student 2 Count2
...
CountP Student P 1 Student P 2 ... Student P CountP
The first line in each data set contains two positive integers separated by one blank: P (1 <= P <= 100) - the number of courses and N (1 <= N <= 300) - the number of students. The next P lines describe in sequence of the courses �from course 1 to course P, each line describing a course. The description of course i is a line that starts with an integer Count i (0 <= Count i <= N) representing the number of students visiting course i. Next, after a blank, you抣l find the Count i students, visiting the course, each two consecutive separated by one blank. Students are numbered with the positive integers from 1 to N.
There are no blank lines between consecutive sets of data. Input data are correct.
Output
Sample Input
2 3 3 3 1 2 3 2 1 2 1 1 3 3 2 1 3 2 1 3 1 1
Sample Output
YES NO
Source
My code:
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstring>
using namespace std;
const int maxn=333;
bool vis[maxn];
int match[maxn],ans,p,n;
vector<int>map[maxn];
bool dfs(int u)
{
for(int i=0;i<map[u].size();i++)
{
if(!vis[map[u][i]])
{
vis[map[u][i]]=true;
if(match[map[u][i]]==-1||dfs(match[map[u][i]]))
{
match[map[u][i]]=u;
return true;
}
}
}
return false;
}
void hangry()
{
ans=0;
memset(match,-1,sizeof(match));
for(int i=1;i<=p;i++)
{
memset(vis,false,sizeof(vis));
if(dfs(i))
ans++;
}
}
int main()
{
int t,m,v,fg;
while(scanf("%d",&t)==1)
{
while(t--)
{
for(int i=0;i<maxn;i++)
map[i].clear();
fg=1;
scanf("%d%d",&p,&n);
for(int i=1;i<=p;i++)
{
scanf("%d",&m);
if(m==0)
fg=0;
while(m--)
{
scanf("%d",&v);
map[i].push_back(v);
}
}
if(fg==0)
printf("NO\n");
else
{
hangry();
if(ans==p)
printf("YES\n");
else
printf("NO\n");
}
}
}
return 0;
}