1 2 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; }
|