Description

  给定一个连通的带边权的图(允许自环和重边),求不同的最小生成树个数。两个生成树不同当它们所用的边的序号不同,换句话说,重边算多次。

Input

  第一行n,m,表示点数和边数(1<=n<=50000,1<=m<=100000) 下接m行,每行3个数k1,k2,w,表示k1和k2之间有一条权值为w 的边。

Output

  仅一行一个数:生成树个数 mod 1000003(质数)

Sample Input

3 5
1 2 6
1 2 6
2 3 6
3 1 6
3 3 8

Sample Output

5
  注:不会存在5条及5条以上的边,他们的边权是相同的。
  样例解释:
  5棵生成树分别如下(边按输入顺序标号):
  (1,3) (2,3) (1,4) (2,4) (3,4)
  5号边是自环。

HINT

Source

  HNOI2009集训Day3

Solution

  同$BZOJ1016$,感觉如果第一页那题能过,这题也能过。题解依然是我写的。

 #include <bits/stdc++.h>
using namespace std;
struct edge
{
int u, v, w, x;
inline bool operator< (const edge &rhs) const
{
return x < rhs.x;
}
}e[];
struct count
{
int l, r, use;
}g[];
int n, m, fa[], siz[]; int getfa(int x)
{
return fa[x] == x ? x : getfa(fa[x]);
} void link(int u, int v)
{
if(siz[u] > siz[v]) fa[v] = u, siz[u] += siz[v];
else fa[u] = v, siz[v] += siz[u];
} bool Kruskal()
{
int cnt = , u, v;
for(int i = ; i <= m; ++i)
{
u = getfa(e[i].u), v = getfa(e[i].v);
if(u != v)
{
link(u, v);
++g[e[i].w].use;
if(++cnt == n - ) return true;
}
}
return false;
} int DFS(int w, int i, int k)
{
if(k == g[w].use) return ;
if(i > g[w].r) return ;
int ans = , u = getfa(e[i].u), v = getfa(e[i].v);
if(u != v)
{
link(u, v);
ans = DFS(w, i + , k + );
fa[u] = u, fa[v] = v;
}
return ans + DFS(w, i + , k);
} int main()
{
int u, v, w, ans;
cin >> n >> m;
for(int i = ; i <= n; ++i)
fa[i] = i, siz[i] = ;
for(int i = ; i <= m; ++i)
{
cin >> u >> v >> w;
e[i] = (edge){u, v, , w};
}
sort(e + , e + m + );
w = ;
for(int i = ; i <= m; ++i)
if(e[i].x == e[i - ].x) e[i].w = w;
else
{
g[w].r = i - ;
e[i].w = ++w;
g[w].l = i;
}
g[w].r = m;
ans = Kruskal();
for(int i = ; i <= n; ++i)
fa[i] = i, siz[i] = ;
for(int i = ; i <= w; ++i)
{
ans = ans * DFS(i, g[i].l, ) % ;
for(int j = g[i].l; j <= g[i].r; ++j)
{
u = getfa(e[j].u), v = getfa(e[j].v);
if(u != v) link(u, v);
}
}
cout << ans << endl;
return ;
}

[BZOJ1543] 生成树计数 (Kruskal)的更多相关文章

  1. [bzoj1016][JSOI2008]最小生成树计数 (Kruskal + Matrix Tree 定理)

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

  2. kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数

    第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一 ...

  3. 生成树计数 Matrix-Tree 定理 学习笔记

    一直都知道要用Matrix-Tree定理来解决生成树计数问题,但是拖到今天才来学.博主数学不好也只能跟着各位大佬博客学一下它的应用以及会做题,证明实在是不会. 推荐博客: https://www.cn ...

  4. 【BZOJ1002】【FJOI2007】轮状病毒(生成树计数)

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1766  Solved: 946[Submit][Status ...

  5. SPOJ 104 HIGH - Highways 生成树计数

    题目链接:https://vjudge.net/problem/SPOJ-HIGH 解法: 生成树计数 1.构造 基尔霍夫矩阵(又叫拉普拉斯矩阵) n阶矩阵 若u.v之间有边相连 C[u][v]=C[ ...

  6. Luogu P5296 [北京省选集训2019]生成树计数

    Luogu P5296 [北京省选集训2019]生成树计数 题目链接 题目大意:给定每条边的边权.一颗生成树的权值为边权和的\(k\)次方.求出所有生成树的权值和. 我们列出答案的式子: 设\(E\) ...

  7. Loj 2320.「清华集训 2017」生成树计数

    Loj 2320.「清华集训 2017」生成树计数 题目描述 在一个 \(s\) 个点的图中,存在 \(s-n\) 条边,使图中形成了 \(n\) 个连通块,第 \(i\) 个连通块中有 \(a_i\ ...

  8. 「UVA10766」Organising the Organisation(生成树计数)

    BUPT 2017 Summer Training (for 16) #6C 题意 n个点,完全图减去m条边,求生成树个数. 题解 注意可能会给重边. 然后就是生成树计数了. 代码 #include ...

  9. SPOJ.104.Highways([模板]Matrix Tree定理 生成树计数)

    题目链接 \(Description\) 一个国家有1~n座城市,其中一些城市之间可以修建高速公路(无自环和重边). 求有多少种方案,选择修建一些高速公路,组成一个交通网络,使得任意两座城市之间恰好只 ...

随机推荐

  1. php get_called_class()函数与get_class()函数的区别

    get_class (): 获取当前调用方法的类名: get_called_class():获取静态绑定后的类名: class Foo{ public function test(){ var_dum ...

  2. 洛谷 P2762 太空飞行计划问题 P3410 拍照【最大权闭合子图】题解+代码

    洛谷 P2762 太空飞行计划问题 P3410 拍照[最大权闭合子图]题解+代码 最大权闭合子图 定义: 如果对于一个点集合,其中任何一个点都不能到达此集合以外的点,这就叫做闭合子图.每个点都有一个权 ...

  3. React设计思想

    熟悉一个新技术的关键是熟悉他的特色和理念 React框架本身和我们常用的JavaScript MVC框架,如:AngularJS,Backbone,Ember等,没有直接的可比性.在React的官方博 ...

  4. 记录一则fsck的简单案例

    环境:RHEL 6.5 + ext4文件系统 我个人实验环境的一个虚拟机,开机时在Checking filesystems时,有报错: /dev/mapper/vg_linuxbase-lv_root ...

  5. C# HelpPage 接口文档配置

    1.打开项目路径如下的类文件: 1.1.找类方法 Register 下的 config.SetDocumentationProvider 并取消注释,修改 ~/App_Data/XmlDocument ...

  6. kvm命令总结和虚机器备份迁移

    管理kvm虚拟机命令 virsh uri:                                          查看当前主机上hypervisor的连接路径: virsh connect ...

  7. java中错误日志的用法

    1.maven包:将下面的maven加入到pom.xml <!-- https://mvnrepository.com/artifact/log4j/log4j --><depend ...

  8. hdu1061(2015-N1):1.快速幂;2.找规律

    1.快速幂 原理:求a的b次方,将b转化为二进制数,该二进制位第i位的权是2^(i-1), 例如 11的二进制是1011 11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1 因此,我们将a¹ ...

  9. DAY1--JAVA

    学习路线 2017-1-27打卡学习,先学习第一部分Java基础. 面向对象 面向对象---它是从现实世界中客观存在的事物(即对象)出发,并在系统构造中尽可能的运用人类自然的思维方式,来构建软件系统. ...

  10. 《设计模式之禅》--MVC框架

    需求:设计一个MVC框架 (以下可能摘要不全,后期整理) 架构图: * 核心控制器:MVC框架入口,负责接收和反馈HTTP请求 * 过滤器:Servlet容器内的过滤器,实现对数据的过滤处理 * 拦截 ...