TLE40pts求助
查看原帖
TLE40pts求助
1183074
xzy_AK_IOI楼主2025/7/29 15:15
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define F(i,k,n) for (int i=k;i<=n;i++)
#define R(i,k,n) for (int i=k;i>=n;i--)
const int N=1e5+10;
int f[20][20];
int n,m,a,b,s;
int sz[20];
vector<int>T[20];
map<pair<int,int>,bool>mp;
int getnum(int s){
	int sum=0;
	F(i,1,n) if ((s>>(i-1))&1) sum++;
	return sum;
}
void dfs(int u,int fa){
	F(i,1,n) if (s>>(i-1)&1) f[u][i]=1;
    
		F(i,0,(int)T[u].size()-1){
			int v=T[u][i];
			if (v==fa) continue;
			dfs(v,u);
            }
	F(j,1,n){
		F(i,0,(int)T[u].size()-1){
			int v=T[u][i];
			if (v==fa) continue;
			int sum=0;
			F(k,1,n){
				if (mp[make_pair(j,k)]){
					sum+=f[v][k];	
				}
			}
			f[u][j]*=sum;
		}
	}
} 
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	F(i,1,m){
		cin>>a>>b;
		mp[make_pair(a,b)]=mp[make_pair(b,a)]=1;
	}
	F(i,1,n-1){
		cin>>a>>b;
		T[a].push_back(b);T[b].push_back(a);
	}
	int ans=0;
	for (s=0;s<=(1<<n)-1;s++){
		dfs(1,0);
		int tot=0;
		F(i,1,n) tot+=f[1][i];
		memset(f,0,sizeof f);
		ans+=((n-getnum(s))&1?1:-1)*tot;
	}
	cout<<abs(ans);
	return 0;
}
2025/7/29 15:15
加载中...