#include #include using namespace std; using namespace atcoder; using ll=long long; template struct hungarian{//n<=m const T inf=numeric_limits::max(); int n, m, max_match, root; T max_cost; vector> cost; vector lx, ly, slack; vector xy, yx, prev, slackx; vector s, t; void update_labels(){ T delta=inf; for(int y=0; y que; for(int x=0; x> &cost):max_match(0), max_cost(0), cost(cost), n(cost.size()), m(cost[0].size()), lx(n, -inf), ly(m), xy(n, -1), yx(m, -1), s(n), t(m), prev(n), slack(m), slackx(m){ for(int x=0; x 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; } } } string ts[MAXK]; int tk[MAXK]; vector vss(k); for(int i=k-1; i>=0; i--){ int x=vk[i]; vector vs; for(auto y:gk[x]){ if(ordk[y] vss2; string tsn[MAXN][MAXN]; int tn[MAXN][MAXN]; 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[r][x]=t; vn[r][t++]=x; for(auto y:gn[x]){ if(used[y]) continue; que.push(y); used[y]=1; } } for(int i=n-1; i>=0; i--){ int x=vn[r][i]; vector vs; for(auto y:gn[x]){ if(ordn[r][y]> dp(vss.size(), vector(vss2.size(), -INF)); vector> ok(vss.size(), vector(vss2.size())); int ans=-INF; for(int r=0; r=0; i--){ for(int j=k-1; j>=0; j--){ if(!(i==0 && j==0) && ok[tk[j]][tn[r][i]]) continue; int x=vn[r][i], y=vk[j], j1=tk[j], i1=tn[r][i]; ok[j1][i1]=1; for(auto z:gn[x]){ if(ordn[r][z]0) n1--; if(j>0) k1--; if(k1>n1) continue; vector> cost(k1, vector(n1, -INF)); int i2=0; for(auto z:gn[x]){ if(ordn[r][z] h(cost); mx=h.max_cost; } if(i==0 && j==0) ans=max(ans, mx); dp[j1][i1]=max(dp[j1][i1], mx); } } } if(ans<0){ cout<<-1<