1 条题解
-
0
C++ :
#include<algorithm> #include<cstring> #include<cctype> #include<cstdio> #define rep(i,x,y) for(int i=x; i<=y; ++i) #define repd(i,x,y) for(int i=x; i>=y; --i) using namespace std; const int N=18,M=131080; typedef long long LL; bool mp[N][N]; int n,m,cnt,fa[N],dep[N],h[N],bin[N],rk[N],x,y,b[M]; LL f[N][N],ans; struct edge{int v,n;} e[N<<1]; int getint() { char ch; while(!isdigit(ch=getchar())); int x=ch-48; while(isdigit(ch=getchar())) x=x*10+ch-48; return x; } void addedge(int u,int v) { e[cnt]=(edge){v,h[u]},h[u]=cnt++; e[cnt]=(edge){u,h[v]},h[v]=cnt++; } void dfs(int x,int Fa,int Dep) { fa[x]=Fa,dep[x]=Dep; for(int i=h[x]; i!=-1; i=e[i].n) if(e[i].v!=Fa) dfs(e[i].v,x,Dep+1); } LL query(int s) { memset(f,0,sizeof(f)); rep(i,1,n) if(s&(1<<i-1)) rep(j,1,n) f[j][i]=1; repd(i,n,2) { x=rk[i],y=fa[x]; rep(j,1,n) if(s&(1<<j-1)) { LL add=0; rep(k,1,n) if(s&(1<<k-1) && mp[j][k]) add+=f[x][k]; f[y][j]*=add; } } LL rt=0; rep(i,1,n) rt+=f[1][i]; return rt; } int main() { n=getint(),m=getint(),memset(h,-1,sizeof(h)); rep(i,1,1<<n) b[i]=b[i^(i&-i)]+1; rep(i,1,m) x=getint(),y=getint(),mp[x][y]=mp[y][x]=1; rep(i,1,n-1) addedge(getint(),getint()); dfs(1,0,1); rep(i,1,n) ++bin[dep[i]]; rep(i,1,n) bin[i]+=bin[i-1]; rep(i,1,n) rk[bin[dep[i]]--]=i; rep(i,1,(1<<n)-1) { int tot=n-b[i]; if(tot&1) ans-=query(i); else ans+=query(i); } printf("%lld\n",ans); return 0; }
- 1
信息
- ID
- 956
- 时间
- 5000ms
- 内存
- 256MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者