Four options -------------------------------------------- Thinking (dfs )

Insert picture description here
Insert picture description here
Analysis:
first use the questions that select the same answer and check and maintain.
Then do a big search

#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;
 } 

Published 572 original articles · praised 14 · 10,000+ views

Guess you like

Origin blog.csdn.net/qq_43690454/article/details/105449506
dfs