#include<bits/stdc++.h>
using namespace std;
const int M=510,Inf=0x3f3f3f3f;
map<string,int>mp;
bool visit[M];
int l,pre[M],r[M][M];
string q[M],p[M];
int bfs(int s,int t){
int i,p;
memset(visit,0,sizeof(visit));
queue<int>q;
pre[s]=s;
visit[s]=1;
q.push(s);
while(q.empty()==0){
p=q.front();
q.pop();
for(i=1;i<=l;i++)
if(r[p][i]>0&&visit[i]==0){
pre[i]=p;
visit[i]=1;
if(i==t)return 1;
q.push(i);
}
};
return 0;
}
int EK(int s,int t){
int i,d,sum=0;
while(bfs(s,t)){
d=1e9;
for(i=t;i!=s;i=pre[i])
d=min(d,r[pre[i]][i]);
for(i=t;i!=s;i=pre[i]){
r[pre[i]][i]-=d;
r[i][pre[i]]+=d;
}
sum+=d;
}
return sum;
}
int main(){
int i,n,m,k,kase,ans=0;
string t1,t2;
scanf("%d",&kase);
while(kase--){
l=1;
mp.clear();
memset(r,0,sizeof(r));
scanf("%d",&n);
for(i=1;i<=n;i++){
cin>>p[i];
if(mp[p[i]]==0)
mp[p[i]]=++l;
}
scanf("%d",&m);
for(i=1;i<=m;i++){
cin>>t1;
cin>>q[i];
if(mp[q[i]]==0)
mp[q[i]]=++l;
r[1][mp[q[i]]]++;
}
scanf("%d\n",&k);
for(i=1;i<=k;i++){
cin>>t1>>t2;
if(mp[t1]==0)
mp[t1]=++l;
if(mp[t2]==0)
mp[t2]=++l;
r[mp[t1]][mp[t2]]=Inf;
}
l++;
for(i=1;i<=n;i++)
r[mp[p[i]]][l]++;
printf("%d\n",m-EK(1,l));
if(kase)printf("\n");
}
return 0;
}
UVA 743 A Plug for UNIX
最新推荐文章于 2021-02-22 10:25:44 发布