//如果你不知道悲剧是什么,请在A题的时候将数组开小一位,我勒个去! #include <iostream> #include <cstdio> #include <memory.h> #include <vector> #include <string> #include <map> #include <queue> using namespace std; struct Device{ string name,plug; }; struct Adapter{ string face,back; }; const int MAX=105,SIZE=210,INF=1<<30; int n,m,k,start,end, a[SIZE],pa[SIZE], flow[SIZE][SIZE],cap[SIZE][SIZE],uVerTex; vector<string> L; string plug[MAX*MAX]; Device dev[MAX]; Adapter ada[MAX]; map<string,bool> vis; queue<int> q; void dfs(const string& s){ for(int i=0;i<k;i++){ if(ada[i].back==s){ if(!vis.count(ada[i].face)){ vis[ada[i].face]=1; for(int j=0;j<m;j++){ if(ada[i].face==dev[j].plug){ cap[start][uVerTex]=1; cap[uVerTex][n+1+j]=1; cap[n+1+j][end]=1; } } dfs(ada[i].face); } } } return ; } void createGraph(){ string s; for(int i=0;i<n;i++){ vis.clear(); s=plug[i]; vis[s]=1; uVerTex=i+1; for(int i=0;i<m;i++){ if(s==dev[i].plug){ cap[start][uVerTex]=1; cap[uVerTex][n+1+i]=1; cap[n+1+i][end]=1; } } dfs(s); } return ; } int maxFlow(){ int f=0,u,v; memset(flow,0,sizeof(flow)); while(1){ memset(a,0,sizeof(a)); a[start]=INF; q.push(start); while(!q.empty()){ u=q.front(); q.pop(); for(v=0;v<end+1;v++){ if(!a[v]&&cap[u][v]>flow[u][v]){ a[v]=a[u]<(cap[u][v]-flow[u][v])? a[u]:(cap[u][v]-flow[u][v]); pa[v]=u; q.push(v); } } } if(!a[end]) break; for(u=end;u!=start;u=pa[u]){ flow[u][pa[u]]-=a[end]; flow[pa[u]][u]+=a[end]; } //cout<<a[end]<<endl; f+=a[end]; } return f; } int main() { freopen("i.txt","r",stdin); int nCase,num=0; cin>>nCase; start=0; while(nCase--){ if(num++) cout<<endl; cin>>n; L.clear(); for(int i=0;i<n;i++){ cin>>plug[i]; } cin>>m; end =n+m+1; for(int i=0;i<m;i++) cin>>dev[i].name>>dev[i].plug; cin>>k; for(int i=0;i<k;i++) cin>>ada[i].face>>ada[i].back; memset(cap,0,sizeof(cap)); createGraph(); /*for(int i=0;i<end+1;i++){ for(int j=0;j<=end+1;j++){ if(cap[i][j]==1) cout<<i<<" "<<j<<endl; } }*/ cout<<m-maxFlow()<<endl; //cout<<endl; /*for(int i=0;i<end+1;i++){ for(int j=0;j<=end+1;j++){ if(flow[i][j]==1) cout<<i<<" "<<j<<endl; } }*/ //cout<<endl; //cout<<flow[33][193]<<endl; //cout<<cap[33][193]<<endl; } return 0; }