中国(北方)大学生程序设计训练赛(第一周)-A(生成树计数)
2017-03-06 20:15
323 查看
题目链接:A
根据观察,一个结点出现在Prufer序列中,当且仅当它是非叶子结点。
所以如果我们要计算一个结点对答案的贡献,就要算出该结点是非叶子节点的树的个数乘以改结点的值。
对于一个结点 u ,要计算出其非叶子结点生成树个数,可以计算出其是叶子结点的生成树个数,可以用以下算法:
求点 i 为叶子的生成树个数 f(i) :
先将图中所有与 i 相邻的边删去,且将点 i 删去。点 i 的度数为 d(i) 。
求出新图中生成树的个数 f(G) ,那么 f(i)=f(G)∗d(i) 。
生成树计数可以直接百度模板。
根据观察,一个结点出现在Prufer序列中,当且仅当它是非叶子结点。
所以如果我们要计算一个结点对答案的贡献,就要算出该结点是非叶子节点的树的个数乘以改结点的值。
对于一个结点 u ,要计算出其非叶子结点生成树个数,可以计算出其是叶子结点的生成树个数,可以用以下算法:
求点 i 为叶子的生成树个数 f(i) :
先将图中所有与 i 相邻的边删去,且将点 i 删去。点 i 的度数为 d(i) 。
求出新图中生成树的个数 f(G) ,那么 f(i)=f(G)∗d(i) 。
生成树计数可以直接百度模板。
#include<bits/stdc++.h> #define pr pair<int,int> #define mp make_pair #define fi first #define se second using namespace std; typedef long long ll; const ll mod=1e9+7; pr p[10007]; ll C[107][107]; int d[107]; ll det(int n) { ll res=1; for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { while(C[j][i]) { ll t=C[i][i]/C[j][i]; for(int k=i;k<n;k++) { C[i][k]=(C[i][k]-t*C[j][k])%mod; swap(C[i][k],C[j][k]); } res=-res; } } if(C[i][i]==0) return 0; res=res*C[i][i]%mod; } return (res+mod)%mod; } ll cal(int no,int n,int m) { memset(C,0,sizeof(C)); for(int i=0;i<m;i++) { int u=p[i].fi,v=p[i].se; if(u!=no&&v!=no) { if(u>no) --u; if(v>no) --v; C[u][v]=C[v][u]=-1; ++C[u][u];++C[v][v]; } } return det(n-1); } int main() { int n,m; int T; scanf("%d",&T); while(T--) { memset(d,0,sizeof(d)); scanf("%d%d",&n,&m); int u,v; for(int i=0;i<m;i++) { scanf("%d%d",&u,&v); p[i].fi=--u;p[i].se=--v; d[u]++;d[v]++; } ll ans=0; ll tnum=cal(200,n,m); for(int i=0;i<n;i++) { ll t=cal(i,n-1,m); ans=(ans+(i+1)*(tnum-t*d[i]%mod+mod)%mod)%mod; } printf("%lld\n",ans); } return 0; }
相关文章推荐
- 中国(北方)大学生程序设计训练赛(第一周)
- 中国(北方)大学生程序设计训练赛(第一周)(Problem E: Water Problem-矩阵快速幂)
- 等差区间(写的很脑残)——中国(北方)大学生程序设计训练赛(第一周)F
- 中国(北方)大学生程序设计训练赛(第一周)(Problem B: 埃蒙的时空航道-最小割转dp+贪心)
- 中国(北方)大学生程序设计训练赛(第一周)(Problem F: 等差区间-线段树+等差数列平方和公式)
- 中国(北方)大学生程序设计训练赛(第一周)-D (二分)
- 中国(北方)大学生程序设计训练赛(第一周) (D E)
- 中国(北方)大学生程序设计训练赛(第一周)(Problem D: 数学题-二分+双指针)
- 矩阵快速幂-中国(北方)大学生程序设计训练赛(第一周)Water Problem
- 中国(北方)大学生程序设计训练赛(第一周)E. water problem
- 中国(北方)大学生程序设计训练赛(第一周)-F(线段树)
- 中国(北方)大学生程序设计训练赛(第一周)E. water problem
- 中国(北方)大学生程序设计训练赛(第三周)(Interesting sequence-找规律)
- 中国(北方)大学生程序设计训练赛(第三周)(List likes playing card-期望)
- 中国(北方)大学生程序设计训练赛(第二周)(Problem C: A Water Problem-dp)
- 中国(北方)大学生程序设计训练赛(第二周)(Problem G: Connected Components-并查集)
- 中国(北方)大学生程序设计训练赛(第二周)(Problem A: Common Substrings-hash)
- 中国(北方)大学生程序设计训练赛(第二周) (A B D G)
- 中国(北方)大学生程序设计训练赛(第二周)(Problem B: A Boring Game-乱搞)
- XTU 1268 Strange Optimization 2017年“嘉杰信息杯” 中国大学生程序设计竞赛全国邀请赛(湖南)