#include<iostream>
#include<string.h>
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<string>
#define MAX 1010
using namespace std;
vector<string>name;
bool can[MAX][MAX];
string recept[MAX];
string device[MAX];
bool map[MAX][MAX];
bool visit[MAX];
int match[MAX];
int n,p;
bool find(int k)
{
int i,j;
for(i=1;i<=n;i++)
{
if(map[k][i]&&visit[i]==false)
{
visit[i]=true;
if(match[i]==0||find(match[i]))
{
match[i]=k;
return true;
}
}
}
return false;
}
int hungary()
{
memset(match,0,sizeof(match));
int sum=0;
for(int i=1;i<=p;i++)
{
memset(visit,0,sizeof(visit));
if(find(i))
sum++;
}
return sum;
}
int getnum(string s)
{
vector<string>::iterator p;
p=find(name.begin(),name.end(),s);
if(p==name.end())
{
name.push_back(s);
return name.size()-1;
}
else
{
return p-name.begin();
}
}
int main()
{
int i,j,k,t;
string devname,name1,name2;
cin>>t;
while(t--)
{
name.clear();
memset(match,0,sizeof(match));
memset(can,0,sizeof(can));
memset(map,0,sizeof(map));
cin>>n;
for(i=0;i<n;i++)
{
cin>>recept[i];
getnum(recept[i]);
}
cin>>p;
for(i=0;i<p;i++)
{
cin>>devname>>device[i];
getnum(device[i]);
}
cin>>k;
for(i=0;i<k;i++)
{
cin>>name1>>name2;
int num1=getnum(name1);
int num2=getnum(name2);
can[num1][num2]=true;
}
int maxnum=name.size();
for(i=0;i<maxnum;i++)
{
for(j=0;j<maxnum;j++)
{
for(k=0;k<maxnum;k++)
{
if(can[k][i]&&can[i][j])
can[k][j]=1;
}
}
}
for(i=0;i<p;i++)
{
for(j=0;j<n;j++)
{
if(device[i]==recept[j]||can[getnum(device[i])][getnum(recept[j])])
map[i+1][j+1]=true;
}
}
cout<<p-hungary()<<endl;
if(t)
cout<<endl;
}
}
zoj1157
最新推荐文章于 2019-10-30 11:27:46 发布