#include<iostream> #include<string> using namespace std; const int maxn=505;//按照题意开305,RuntimeError,估计题目给错范围了,应该有两个是200,而不是100 const int INF=0x7ffffff; int c[maxn][maxn],q[maxn],dep[maxn]; int match(int &n,char c1[30],char str[][30]) { for(int i=1;i<=n;i++) if(strcmp(c1,str[i])==0) return i; //找到,返回序号 strcpy(str[n+1],c1); //新的插座,新添加一个 return ++n; //数量加一 } bool bfs(int n,int s,int t) { int f=0,r=0,u,v; memset(dep,-1,sizeof(dep)); dep[s]=0; q[r++]=s; while(f<r) for(u=q[f++],v=0;v<n;v++) if(c[u][v] && dep[v]==-1) { dep[v]=dep[u]+1; q[r++]=v; if(v==t) {f=r; break;} } return dep[v]==-1; } int dinic(int n,int u,int sum) { if(u==n-1) return sum; int tmp=sum,cost,v,min; for(v=0;v<n;v++) if(c[u][v] && dep[v]==dep[u]+1) { min=sum<c[u][v]?sum:c[u][v]; cost=dinic(n,v,min); c[u][v] -= cost; c[v][u] += cost; sum -= cost; } return tmp-sum; } int main() { char receptacle[maxn][30],c1[30],c2[30]; int m,k,s,n,t,u,v,renum; cin>>n; renum=n; for(u=1;u<=n;u++) scanf("%s",receptacle[u]); cin>>m; for(v=1;v<=m;v++) { scanf("%s%s",c2,c1); u=match(n,c1,receptacle); c[u+m][v]=1; } cin>>k; while(k--) { scanf("%s%s",&c1,&c2); u=match(n,c2,receptacle); //是从后面的变成前面的 v=match(n,c1,receptacle); c[m+u][m+v]=INF; //可以有无数个适配器 } s=0; t=n+m+1; for(u=1;u<=renum;u++) //renum为原来的插座数量,WA了好多次 c[s][u+m]=1; for(v=1;v<=m;v++) c[v][t]=1; n=t+1; int ans=0; while(!bfs(n,s,t)) ans += dinic(n,s,INF); cout<<m-ans<<endl; return 0; }