最小生成树计数

题目描述

现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的).由于不同的最小生成树可能很多,所以你只需要输出方案数对$31011$的模就可以了.

输入

第一行两个数$n$和$m$,其中$1\le n\le 100,1\le m\le 1000$,分别表示无向图的节点数和边数.每个节点用$1 \ldots n$的整数编号.接下来$m$行,每行三个整数$a,b,c$表示节点$a$与节点$b$之间有一条权值为$c$的边.$1\le c\le 1 \times 10^9$.保证没有自环或重边. //$c$相同的边不超过$10$条.

输出

输出不同的最小生成树有多少个.你只需要输出数量对$31011$的模就可以了.

样例

IN
4 6
1 2 1
1 3 1
1 4 1
2 3 2
2 4 1
3 4 1
OUT
8

大家应该都知道Kruskal吧...还是稍微提一下好了.
Kruskal是一种最小生成树算法,就是将途中所有边从小到大排序再挨个扫描,每扫描到一条新边时就查看下这条边连接的两端点是否属于同一个联通块,如果是的就不加进去,否则就加进去.大家可以认为这个算法是'显然正确'的.至于为什么是正确的呢,我的想法不够严谨,我就不拉出来献丑了.
好了,一条边被Kruskal选中是要拼RP的.也就是说,如果在sort时,一条边比另一条边拍得更前面,它选中的机率越大.
这时,如果我们将处理一个特定权值$n$的所有边看成一个阶段,这时我们先不要将这些边急着加进去,而是一起处理.具体方法就是设上一个阶段的生成森林为$F_L$,如果加进一条$n$的边使得$F_L$中的一棵树变成了仙人掌,我们就弃掉它[P].反之,将它加入一个临时图$T_N$中.阶段完成后,将$T_N$加入缩点后的$F_L$中,求它每个子联通块的生成树个数,相乘,再把这个结果和上一个阶段的结果相乘就是这个阶段的结果了.当然我们无需显式地缩点,我们只需要对联通块直接计算,因为我们将每个$F_L$联通块之内的边都去掉了[P].
具体细节很难想,不过是一道好题.比较有意思.注意每个阶段末要随便选择一种方案啊.

-------------------------------------------------------------

代码

(不会计算行列式怎么破= =)

int det(int a[][N],int n)
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
a[i][j]%=mod;
int ret=1;
for(int i=1; i<n; i++)
{
for(int j=i+1; j<n; j++)
while(a[j][i])
{
int t=a[i][i]/a[j][i];
for(int k=i; k<n; k++)
a[i][k]=(a[i][k]-a[j][k]*t)%mod;
for(int k=i; k<n; k++)
swap(a[i][k],a[j][k]);
ret=-ret;
}
if(a[i][i]==0)
return 0;
ret=ret*a[i][i]%mod;
}
if(ret<0)
ret=-ret;
return (ret+mod)%mod;
}

神奇的det算法...似乎也是高斯消元,怎么没有逆元?

[BZOJ]1016 JSOI2008 最小生成树计数的更多相关文章

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

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

  2. [BZOJ 1016] [JSOI2008] 最小生成树计数 【DFS】

    题目链接:BZOJ - 1016 题目分析 最小生成树的两个性质: 同一个图的最小生成树,满足: 1)同一种权值的边的个数相等 2)用Kruscal按照从小到大,处理完某一种权值的所有边后,图的连通性 ...

  3. BZOJ.1016.[JSOI2008]最小生成树计数(Matrix Tree定理 Kruskal)

    题目链接 最小生成树有两个性质: 1.在不同的MST中某种权值的边出现的次数是一定的. 2.在不同的MST中,连接完某种权值的边后,形成的连通块的状态是一样的. \(Solution1\) 由这两个性 ...

  4. bzoj 1016 [JSOI2008]最小生成树计数——matrix tree(相同权值的边为阶段缩点)(码力)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1016 就是缩点,每次相同权值的边构成的联通块求一下matrix tree.注意gauss里的 ...

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

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

  6. BZOJ 1016 [JSOI2008]最小生成树计数 ——Matrix-Tree定理

    考虑从小往大加边,然后把所有联通块的生成树个数计算出来. 然后把他们缩成一个点,继续添加下一组. 最后乘法原理即可. 写起来很恶心 #include <queue> #include &l ...

  7. 【BZOJ 1016】 1016: [JSOI2008]最小生成树计数 (DFS|矩阵树定理)

    1016: [JSOI2008]最小生成树计数 Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树 ...

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

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 6200  Solved: 2518[Submit][St ...

  9. 【BZOJ】1016: [JSOI2008]最小生成树计数 深搜+并查集

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

随机推荐

  1. java的RMI(Remote Method Invocation)

    RMI 相关知识RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络 ...

  2. javaee添加验证码

    package com.zh.code; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import j ...

  3. Oracle中的伪列

    分页查询中,需要用到伪列rownum,代码如下: select * from (select rownum rn, name from cost where rownum <= 6) where ...

  4. easyloader.js源代码分析

    http://www.cnblogs.com/jasonoiu/p/easyloader_source_code_analysis.html Jquery easyui是一个javascript UI ...

  5. idea修改运行内存

    安装目录下的bin 找到idea.exe.vmoptions 最大的修改下-Xmx1024m 找到idea64.exe.vmoptions 最大的修改下-Xmx1024m

  6. WAMP 403 Forbidden禁止访问

    WAMP .5修改方法 修改httpd.conf文件 # onlineoffline tag - don't remove Require local To # onlineoffline tag - ...

  7. mongodb基本数据类型

    本文导读:Mongodb是一种强大,灵活,可扩展的数据存储方式.它扩展了关系型数据库众多有用的功能,如索引,范围查询和排序. MongoDB的文件存储格式为BSON,同JSON一样支持往其它文档对象和 ...

  8. VS2013配置Caffe卷积神经网络工具(64位Windows 7)——准备依赖库

    VS2013配置Caffe卷积神经网络工具(64位Windows 7)--准备依赖库 2014年4月的时候自己在公司就将Caffe移植到Windows系统了,今年自己换了台电脑,想在家里也随便跑跑,本 ...

  9. hdu 1284 钱币兑换问题(动态规划)

    Ac code : 完全背包: #include<stdio.h> #include<string.h> int dp[4][40000]; int main(void) { ...

  10. --hdu 2570 迷瘴(贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2570 Ac code: #include<stdio.h> #include<std ...