1 条题解

  • 0
    @ 2021-6-15 13:44:11

    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
    上传者