69,369
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <cstring>
#include<cstdio>
#define N 1505
using namespace std; //定义链表
struct link
{
int data; //存放数据
link* next; //指向下一个节点
link(int=0);
};
link::link(int n)
{
data=n;
next=NULL;
}
int result[N]; //记录n1中的点匹配的点的编号
bool state [N]; //记录n1中的每个点是否被搜索过
link *head [N]; //记录n2中的点的邻接节点
link *last [N]; //邻接表的终止位置记录
//判断能否找到从节点n开始的增广路
bool find(const int n)
{
link* t=head[n];
while (t!=NULL) //n仍有未查找的邻接节点时
{
if (!(state[t->data])) //如果邻接点t->data未被查找过
{
state[t->data]=true; //标记t->data为已经被找过
if ((result[t->data]==-1) || //如果t->data不属于前一个匹配M
(find(result[t->data]))) //如果t->data匹配到的节点可以寻找到增广路
{
result[t->data]=n; //那么可以更新匹配M',其中n1中的点t->data匹配n
return true; //返回匹配成功的标志
}
}
t=t->next; //继续查找下一个n的邻接节点
}
return false;
}
int flag[N];
int main()
{
int n,m;
while(scanf("%d",&n)==1)
{
memset(flag,0,sizeof(flag));
memset(result,-1,sizeof(result));
for (int i=0; i < n; i++)
{
int t1=0, t2=0;
scanf("%d:(%d)",&t1,&m);
if(flag[t1]==0)
{
while(m--)
{
scanf("%d",&t2);
flag[t2]=1;
if (last[t1]==NULL)
last[t1]=head[t1]=new link(t2);
else
last[t1]=last[t1]->next=new link(t2);
}
}
else
{
while(m--)
{
scanf("%d",&t2);
if (last[t1]==NULL)
last[t2]=head[t2]=new link(t1);
else
last[t2]=last[t2]->next=new link(t1);
}
}
}
int ans=0;
for (int i=0; i<n; i++)
{
memset(state, 0, sizeof(state));
if (find(i)) ans++;
}
cout<<ans<<endl;
}
return 0;
}