Description
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.
Input
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
Output
5
2
思路:ans=n-二分图最大独立点集/2
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int mm=1e4+9;
const int mn=5e6+9;
class node
{
public:int v,next;
}e[mn];
int head[mm],edge,n,dot;
int Left[mm];
bool vis[mm];
void data()
{
memset(head,-1,sizeof(head));dot=edge=0;
}
void add(int u,int v)
{
e[edge].v=v;e[edge].next=head[u];head[u]=edge++;
}
void read()
{ int u,v,m;char c;
scanf("%d:",&u);
if(u==-1)u=0;
while(1)
{
c=getchar();
if(c=='(')break;
}
scanf("%d",&m);dot=max(dot,u);
while(1)
{
c=getchar();
if(c==')')break;
}
for(int i=0;i<m;++i)
{
scanf("%d",&v);dot=max(dot,v);
if(u<v){add(u,v);add(v,u);}
}
}
int dfs(int u)
{ int v;
for(int i=head[u];~i;i=e[i].next)
{
v=e[i].v;
if(vis[v])continue;
vis[v]=1;
if(Left[v]==-1||dfs(Left[v]))
{
Left[v]=u;return 1;
}
}
return 0;
}
int get_max()
{ int ret=0;
memset(Left,-1,sizeof(Left));
for(int i=0;i<=dot;++i)
{ memset(vis,0,sizeof(vis));
if(dfs(i))
++ret;
}
return ret;
}
int main()
{ int u,v,m;char c;
while(~scanf("%d",&n))
{ data();
for(int i=0;i<n;++i)
{
read();
}
int ans=n-get_max()/2;
printf("%d\n",ans);
}
return 0;
}
1万+



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



