#include #include using namespace std; using namespace atcoder; using ll=long long; const int MAXN=100; const int MAXK=100; const int INF=1e6; int n, k, vn[MAXN], vk[MAXK], ordn[MAXN], ordk[MAXK];; vector gn[MAXN], gk[MAXK]; int main() { cin>>k; for(int i=0; i>a>>b; a--; b--; gk[a].push_back(b); gk[b].push_back(a); } cin>>n; for(int i=0; i>a>>b; a--; b--; gn[a].push_back(b); gn[b].push_back(a); } { queue que; que.push(0); bool used[MAXK]={}; used[0]=1; int t=0; while(!que.empty()){ int x=que.front(); que.pop(); ordk[x]=t; vk[t++]=x; for(auto y:gk[x]){ if(used[y]) continue; que.push(y); used[y]=1; } } } int ans=-INF; for(int r=0; r que; que.push(r); bool used[MAXN]={}; used[r]=1; int t=0; while(!que.empty()){ int x=que.front(); que.pop(); ordn[x]=t; vn[t++]=x; for(auto y:gn[x]){ if(used[y]) continue; que.push(y); used[y]=1; } } int dp[MAXN][MAXK]; for(int i=0; i=0; i--){ for(int j=k-1; j>=0; j--){ int x=vn[i], y=vk[j]; for(auto z:gn[x]){ if(ordn[z]0) n1--; if(j>0) k1--; if(k1>n1) continue; mcf_graph g(k1+n1+2); int s=k1+n1, t=s+1; for(int l=0; l