题意大概是,有那么一个动物园,动物园里面呢只有猫猫狗狗。 进来的小朋友都会有一种喜欢的动物,而且会讨厌另外一种的动物中的一直。现在动物园要赶走动物园里面的一些动物,而只有喜欢的动物还在,讨厌的动物被赶走了,这样的小盆友才会开心。然后问你,怎样子才能让更多的的小朋友喜欢。
脑洞:这就是一个矛盾的事情。因为一个小朋友喜欢的动物可能是另外一个小朋友讨厌的动物。而如果这样的话,两个小朋友就只能剩下一个。。所以呢,把喜欢猫的小朋友和喜欢狗的小朋友分别被分到X集合和Y集合。然后让他们去匹配。每一个匹配中只有一个小朋友能开心。
而这里的问题就是如何把这些东西存下来的问题。可以声明一个结构体,然后有两个结构体数组,分别为猫和狗。
struct node
{
string love;
string hate;
} cat[len], dog[len];
int m[len][len];
int vis[len], l[len];
int N, M, P;
int cnt_c, cnt_d;
int main()
{
while (cin >> N >> M >> P)
{
Init();
string s1, s2;
for (int i=0; i<P; i++)
{
cin >> s1 >> s2;
if (s1[0] == 'C')
{
cat[cnt_c].love = s1;
cat[cnt_c++].hate = s2;
}
else if (s1[0] == 'D')
{
dog[cnt_d].love = s1;
dog[cnt_d++].hate = s2;
}
}
for (int i=0; i<cnt_c; i++)
{
for (int j=0; j<cnt_d; j++)
{
if (cat[i].hate == dog[j].love || cat[i].love == dog[j].hate)
m[i][j] ++;
}
}
int ans = 0;
for (int i=0; i<cnt_c; i++)
{
memset(vis, 0, sizeof(vis));
if (find(i)) ans ++;
}
// for (int i=0; i<cnt_d; i++)
// cout << l[i] << " ";
// cout << endl;
cout << P - ans << endl;
}
return 0;
}
void Init()
{
cnt_c = 0;
cnt_d = 0;
memset(m, 0, sizeof(m));
memset(vis, 0, sizeof(vis));
memset(l, -1, sizeof(l));
for (int i=0; i<len; i++)
{
cat[i].love = "";
cat[i].hate = "";
dog[i].love = "";
dog[i].hate = "";
}
}
bool find(int p)
{
for (int i=0; i<cnt_d; i++)
{
if ( !vis[i] && m[p][i]!=0 )
{
vis[i] ++;
if (l[i] == -1|| find(l[i]))
{
l[i] = p;
return true;
}
}
}
return false;
}