就是建立图的问题,根据两个小朋友喜欢或不喜欢,找不出不可以呆在一起的小朋友,然后最大匹配,刚刚接触的时候不会做,进度太慢了
#include <iostream>
using namespace std;
int n,m,k;
int dog[102][502],dog_num[102];//讨厌小狗的小朋友,dog_num[i]记录dog[i][]小朋友的数量
int cat[102][502],cat_num[102];//讨厌小猫的小朋友,cat_num[i]记录cat[i][]小朋友的数量
bool map[502][502];
int linkx[502];
int linky[502];
bool used[502];
struct CHILD
{
char ch;
int num;
}child[502];
inline int Max(const int a,const int b)
{
if(a>b) return a;
return b;
}
inline void Inti()
{
int i,j;
for (i=1;i<=k;i++)
{
linkx[i]=-1;
linky[i]=-1;
for (j=1;j<=k;j++)
{
map[i][j]=false;
}
}
int temp=Max(n,m);
for (i=1;i<=temp;i++)
{
cat_num[i]=0;
dog_num[i]=0;
}
}
int path(int x)
{
int i;
for (i=1;i<=k;i++)
{
if(!used[i]&&map[x][i])
{
used[i]=true;
if (linky[i]==-1||path(linky[i]))
{
linky[i]=x;
linkx[x]=i;
return 1;
}
}
}
return 0;
}
int main()
{
int i,j;
char ch;
int num;
while (scanf("%d%d%d",&n,&m,&k)!=EOF)
{
Inti();
for (i=1;i<=k;i++)//小孩子的序号
{
scanf("%*c%c%d%*c%c%d",&child[i].ch,&child[i].num,&ch,&num);
if(ch=='D')//记录讨厌动物的孩子
{
dog[num][dog_num[num]++]=i;
}
else
{
cat[num][cat_num[num]++]=i;
}
}
for (i=1;i<=k;i++)//建立图
{
if(child[i].ch=='D')
{
for (j=0;j<dog_num[child[i].num];j++)
{
int temp=dog[child[i].num][j];//表示这个小孩喜欢的动物对应讨厌的孩子,建立图
// if(!map[i][temp]&&!map[temp][i])
// map[i][temp]=true;//表示两个小孩子有矛盾 这里错了,画图就知道为什么错了
map[i][temp]=map[temp][i]=true;
}
}
else
{
for (j=0;j<cat_num[child[i].num];j++)
{
int temp=cat[child[i].num][j];//表示这个小孩喜欢的动物对应讨厌的孩子,建立图
//if(!map[i][temp]&&!map[temp][i])
// map[i][temp]=true;//表示两个小孩子有矛盾 这里错了
map[i][temp]=map[temp][i]=true;
}
}
}
int sum=0;
for (i=1;i<=k;i++)
{
if(linkx[i]==-1)
{
memset(used,false,sizeof(used));
sum+=path(i);
}
}
//printf("%d\n",k-sum); 相应改变
printf("%d\n",k-sum/2);
}
return 0;
}