| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 
 | #include<bits/stdc++.h>#define inf 0x3f3f3f3f3f3f3f3fll
 #define debug(x) cerr<<#x<<"="<<x<<endl
 using namespace std;
 using ll=long long;
 using ld=long double;
 using pli=pair<ll,int>;
 using pi=pair<int,int>;
 template<typename A>
 using vc=vector<A>;
 template<typename A,const int N>
 using aya=array<A,N>;
 inline int read()
 {
 int s=0,w=1;char ch;
 while((ch=getchar())>'9'||ch<'0') if(ch=='-') w=-1;
 while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
 return s*w;
 }
 inline ll lread()
 {
 ll s=0,w=1;char ch;
 while((ch=getchar())>'9'||ch<'0') if(ch=='-') w=-1;
 while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
 return s*w;
 }
 ll dp[20][20];
 vc<int>g[20];
 bool e[20][20];
 int n,m,sta;
 ll ans;
 ll get(int num,int fa)
 {
 ll ans=0;
 memset(dp[num],0,sizeof(dp[num]));
 for(int i=1;i<=n;i++) if((sta>>i)&1) dp[num][i]=1,ans++;
 
 for(int p:g[num]) if(p!=fa)
 {
 get(p,num);ans=0;
 for(int j=1;j<=n;j++) if((sta>>j)&1)
 {
 ll mem=dp[num][j];dp[num][j]=0;
 for(int k=1;k<=n;k++) if(e[k][j]) dp[num][j]+=mem*dp[p][k];
 ans+=dp[num][j];
 }
 }
 return ans;
 }
 int main()
 {
 n=read(),m=read();
 for(int i=1;i<=m;i++)
 {
 int u=read(),v=read();
 e[u][v]=e[v][u]=1;
 }
 for(int i=1;i<n;i++)
 {
 int u=read(),v=read();
 g[u].push_back(v);
 g[v].push_back(u);
 }
 
 for(int s=0;s<(1<<n);s++)
 {
 sta=s<<1;ll val=get(1,1);
 if((n-__builtin_popcount(s))&1) val=-val;
 ans+=val;
 }
 printf("%lld\n",ans);
 return 0;
 }
 
 |