Link:http://acm.hdu.edu.cn/showproblem.php?pid=1068
Girls and Boys
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7756 Accepted Submission(s): 3559
The input contains several data sets in text format. Each data set represents one set of subjects of the study, with the following description:
the number of students
the description of each student, in the following format
student_identifier:(number_of_romantic_relations) student_identifier1 student_identifier2 student_identifier3 ...
or
student_identifier:(0)
The student_identifier is an integer number between 0 and n-1, for n subjects.
For each given data set, the program should write to standard output a line containing the result.
7 0: (3) 4 5 6 1: (2) 4 6 2: (0) 3: (0) 4: (2) 0 1 5: (1) 0 6: (2) 0 1 3 0: (2) 1 2 1: (1) 0 2: (1) 0
5 2
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn=11111;
vector<int>map[maxn];
int match[maxn],n,m,k,ans;
bool vis[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()
{
memset(match,-1,sizeof(match));
ans=0;
for(int i=0;i<n;i++)
{
memset(vis,false,sizeof(vis));
if(dfs(i))
{
ans++;
}
}
}
int main()
{
int u,v,num,i;
while(scanf("%d",&n)==1)
{
num=n;
for(i=0;i<n;i++)
map[i].clear();
while(num--)
{
scanf("%d: (%d)",&u,&m);
for(i=1;i<=m;i++)
{
scanf("%d",&v);
map[u].push_back(v);
}
}
hangry();
printf("%d\n",n-ans/2);
}
return 0;
}
3万+



被折叠的 条评论
为什么被折叠?



