传送门

首先最小生成树有这么两个性质

1.不同的最小生成树中,每种权值的边出现的个数是确定的2.不同的生成树中,某一种权值的边连接完成后,形成的联通块状态是一样的

打个比方,以下图为例(图是网上的)

虚线代表边权相同的边。那么我们可以先把连通块内的做完,缩点,变成这样

然后我们对这个新的连通块做一次矩阵树

根据乘法原理,最后的答案就是所有的乘起来

//minamoto
#include<bits/stdc++.h>
#define rint register int
using namespace std;
const int N=105,M=1005,P=31011;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
int read(){int res,f=1;char ch;while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');return res*f;
}
struct eg{int u,v,w;inline bool operator <(const eg &b)const{return w<b.w;}
}e[M];
int n,m,ans=1,fa[N],bl[N],vis[N],g[N][N],G[N][N];vector<int>s[N];
inline int find(int x,int *fa){return fa[x]==x?x:fa[x]=find(fa[x],fa);}
inline int add(int x,int y){return x+y>=P?x+y-P:x+y;}
inline int dec(int x,int y){return x-y<0?x-y+P:x-y;}
int det(int n){int ans=1,f=1;for(rint i=1;i<=n;++i)for(rint j=1;j<=n;++j)G[i][j]=add(G[i][j],P);for(rint i=1;i<=n;++i){for(rint j=i+1;j<=n;++j)while(G[j][i]){int t=G[i][i]/G[j][i];for(rint k=i;k<=n;++k)G[i][k]=dec(G[i][k],t*G[j][k]%P);for(rint k=i;k<=n;++k)swap(G[i][k],G[j][k]);f=-f;}if(!G[i][i])return 0;ans=ans*G[i][i]%P;}return add(f*ans,P);
}
void calc(){for(rint i=1;i<=n;++i)if(vis[i])s[find(i,fa)].push_back(i),vis[i]=0;for(rint i=1;i<=n;++i)if(s[i].size()>1){int t=s[i].size();memset(G,0,sizeof(G));for(rint j=1;j<=t;++j)for(rint k=j+1;k<=t;++k){int u=s[i][j-1],v=s[i][k-1];if(g[u][v]){G[j][k]=G[k][j]=-g[u][v];G[j][j]+=g[u][v],G[k][k]+=g[u][v];}}ans=ans*det(t-1)%P;for(rint j=1;j<=t;++j)bl[s[i][j-1]]=i;}for(rint i=1;i<=n;++i)vector<int>().swap(s[i]),fa[i]=bl[i]=find(i,bl);
}
int main(){
//  freopen("testdata.in","r",stdin);n=read(),m=read();for(rint i=1;i<=n;++i)fa[i]=bl[i]=i;for(rint i=1;i<=m;++i)e[i].u=read(),e[i].v=read(),e[i].w=read();sort(e+1,e+1+m),e[0].w=e[1].w;for(rint i=1;i<=m;++i){if(e[i].w!=e[i-1].w)calc();int u=find(e[i].u,bl),v=find(e[i].v,bl);if(u!=v){vis[u]=vis[v]=1;++g[u][v],++g[v][u];fa[find(u,fa)]=find(v,fa);}}calc();for(rint i=2;i<=n;++i)if(bl[i]!=bl[i-1])return puts("0"),0;printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/9988967.html

P4208 [JSOI2008]最小生成树计数相关推荐

  1. 洛谷 P4208 [JSOI2008]最小生成树计数 矩阵树定理

    题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的).由于不同的 ...

  2. BZOJ1016 || 洛谷P4208 [JSOI2008]最小生成树计数【矩阵树定理】

    时空限制 1000ms / 128MB 题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则 ...

  3. bzoj1016 [JSOI2008]最小生成树计数

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 6032  Solved: 2452 [Submit][ ...

  4. BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )

    不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...

  5. bzoj 1016: [JSOI2008]最小生成树计数

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5893  Solved: 2395 [Submit][ ...

  6. 【BZOJ1016】【Luogu P4208】 [JSOI2008]最小生成树计数 最小生成树,矩阵树定理

    蛮不错的一道题,遗憾就遗憾在数据范围会导致暴力轻松跑过. 最小生成树的两个性质: 不同的最小生成树,相同权值使用的边数一定相同. 不同的最小生成树,将其都去掉同一个权值的所有边,其连通性一致. 这样我 ...

  7. bzoj 1016: [JSOI2008]最小生成树计数【dfs+克鲁斯卡尔】

    有一个性质就是组成最小生成树总边权值的若干边权总是相等的 这意味着按边权排序后在权值相同的一段区间内的边能被选入最小生成树的条数是固定的 所以先随便求一个最小生成树,把每段的入选边数记录下来 然后对于 ...

  8. BZOJ1016:[JSOI2008]最小生成树计数——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1016 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不 ...

  9. [JSOI2008]最小生成树计数

    OJ题号: BZOJ1016 题目大意: 给定一个无向带权图,求最小生成树的个数. 思路: 先跑一遍最小生成树,统计相同权值的边出现的个数. 易证不同的最小生成树,它们不同的那一部分边的权值实际上是相 ...

最新文章

  1. EXP/EXPDP, IMP/IMPDP应用
  2. 微博平台StatusNet研究(3):友好URL与OpenID支持
  3. python 3.5(socket)
  4. Linux源码手机,Linux操作系统源代码详细分析
  5. python自动化测试框架pytest.pdf_Python 自动化测试框架 unittest 和 pytest 对比
  6. 推荐一个 angular 图像加载插件
  7. SpringDataJpa报错: Table 'XX.hibernate_sequence' doesn't exist
  8. [深度学习] 分布式模式介绍(一)
  9. 诗与远方:无题(六)
  10. STM32矩阵键盘的实现原理
  11. XX复盘记录(模板)
  12. 原生android字体,安卓原生字体
  13. 笔试面试题集(java)
  14. 记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析
  15. APP项目的开发流程
  16. Luat 功能开发教程(十六) LittleVGL
  17. IPv6改造的重要性
  18. 前端Web工程师学习路线
  19. 中南民族大学计算机图像处理实验报告,中南民族大学数字图像处理实验报告.docx...
  20. OGM 与mongodb

热门文章

  1. celery 停止任务_celery 停止执行中 task
  2. 轻量级网络综述 — 主干网络篇
  3. Android无线热点默认属性修改
  4. 高速公路交警的经验之谈[转自QQ群]
  5. 一文全搞定:应届生offer,三方,劳动合同区别与注意事项
  6. Cortana小娜失败背后,微软的傲慢与偏见
  7. Your hostname, xxx resolves to a loopback address: 127.0.1.1; using x.x.x.x instead(on interface xx)
  8. 七.Docker网络管理以及固定ip
  9. mysql error 1236_MySQL Error 1236 错误解决办法
  10. 2022-2028全球及中国电动直线执行器行业研究及十四五规划分析报告