LOJ已过,洛谷70,求卡常
查看原帖
LOJ已过,洛谷70,求卡常
101694
yummyeaten楼主2022/7/5 14:51
#include<bits/stdc++.h>
using namespace std;
int n,m,st,c1[1<<18];
bool g[20][20],vis[20][20];
vector<int> son[20];
long long dp[20][20];
long long count(int rt,int fa,int to)
{
	if(vis[rt][to])
		return dp[rt][to];
	
	vis[rt][to]=1;
	long long res=1;
	for(int x:son[rt])
	{
		if(x==fa)
			continue;
		long long tmp=0;
		for(int i=1;i<=n;i++)
		{
			if((st&(1<<i)) && g[to][i])
				tmp+=count(x,rt,i);
		}
		res*=tmp;
	}
	
	dp[rt][to]=res;
	return res;
}
int main()
{
	int u,v;
	scanf("%d%d",&n,&m);
	if(n&1)
		c1[0]=-1;
	else
		c1[0]=1;
	for(int i=1;i<(1<<n+1);i++)
		if(i&1) c1[i]=-c1[i>>1];
		else    c1[i]=c1[i>>1];
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&u,&v);
		g[u][v]=g[v][u]=1;
	}
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		son[u].push_back(v);
		son[v].push_back(u);
	}
	for(int i=1;i<=n;i++)
		g[0][i]=1;
	son[0].push_back(1);
	long long ans=0;
	
	for(st=0;st<(1<<n+1);st+=2)
	{
		memset(vis,0,sizeof vis);
		ans+=c1[st]*count(0,0,0);
	}
	printf("%lld\n",ans);
	return 0;
}
2022/7/5 14:51
加载中...