西安建设和住房保障局网站个人做网站语言
西安建设和住房保障局网站,个人做网站语言,专业的网站开发建访,上海国际建设总承包公司网站正题
题目链接:https://www.luogu.com.cn/problem/P3349 题目大意 nnn个点的一棵树#xff0c;再给出一张图#xff0c;树上每个点对应图上每个点后要求树上的边图上都有#xff0c;求有多少种对应方式。 解题思路
由于题目要求每个点只出现一次就加大了难度#xff0c;可…正题
题目链接:https://www.luogu.com.cn/problem/P3349 题目大意
nnn个点的一棵树再给出一张图树上每个点对应图上每个点后要求树上的边图上都有求有多少种对应方式。 解题思路
由于题目要求每个点只出现一次就加大了难度可以考虑用容斥去掉这个限制。如果至少有kkk个点重复出现过那么这种情况的容斥系数就为(−1)k(-1)^k(−1)k。 我们可以枚举一个集合sss那么sss中的所有点都不选那么就至少会有∣s∣|s|∣s∣个点重复容斥系数就为(−1)∣s∣(-1)^{|s|}(−1)∣s∣。然后上dpdpdp即可这样的时间复杂度大概是O(n∑s∈G∣s∣2)O(n\sum_{s\in G}|s|^2)O(n∑s∈G∣s∣2)。
计算下来大概是1e71e71e7级别的可以通过本题。 codecodecode
#includecstdio
#includecstring
#includealgorithm
#define ll long long
using namespace std;
const ll N18;
struct node{ll to,next;
}a[N*2];
ll n,m,tot,s,ans,ls[N],f[N][N];
bool v[N][N];
void addl(ll x,ll y){a[tot].toy;a[tot].nextls[x];ls[x]tot;return;
}
void dfs(ll x,ll fa){for(ll p0;pn;p)if(!((1p)s))f[x][p]1;else f[x][p]0;for(ll ils[x];i;ia[i].next){ll ya[i].to;if(yfa)continue;dfs(y,x);for(ll p0;pn;p){ll tmp0;if(s(1p))continue;for(ll q0;qn;q)tmpf[y][q]*v[p][q];f[x][p]*tmp;}}return;
}
int main()
{scanf(%lld%lld,n,m);ll MS(1n);for(ll i1;im;i){ll x,y;scanf(%lld%lld,x,y);x--;y--;v[x][y]v[y][x]1;}for(ll i1;in;i){ll x,y;scanf(%lld%lld,x,y);x--;y--;addl(x,y);addl(y,x);}for(s0;sMS;s){dfs(0,0);ll tmp0;for(ll i0;in;i)tmpf[0][i];ll ws,z1;while(w)w-(w-w),z-z;ansz*tmp;}printf(%lld\n,ans);
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/89896.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!