解析:
先把选择相同答案的题目用并查集维护。
然后大爆搜即可
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
int fa[N];
int cnt[N];
vector<int> res;
int na,nb,nc,nd,m,a,b,n,ans;
int find(int x)
{
if(x!=fa[x]) return fa[x]=find(fa[x]);
return fa[x];
}
void dfs(int u,int a,int b,int c,int d)
{
if(a==na&&b==nb&&c==nc&&d==nd) ans++;
if(u==n) return ;
if(a+res[u]<=na) dfs(u+1,a+res[u],b,c,d);
if(b+res[u]<=nb) dfs(u+1,a,b+res[u],c,d);
if(c+res[u]<=nc) dfs(u+1,a,b,c+res[u],d);
if(d+res[u]<=nd) dfs(u+1,a,b,c,d+res[u]);
}
int main()
{
for(int i=1;i<=12;i++) fa[i]=i;
cin>>na>>nb>>nc>>nd>>m;
while(m--)
{
cin>>a>>b;
int u=find(a);
int v=find(b);
if(u!=v) fa[u]=v;
}
for(int i=1;i<=12;i++) cnt[find(i)]++;
for(int i=1;i<=12;i++)
{
if(cnt[i]) res.push_back(cnt[i]);
}
n=res.size();
dfs(0,0,0,0,0);
cout<<ans<<endl;
}