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

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 7429  Solved: 3098
[Submit][Status][Discuss]

Description

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

Input

  第一行包含两个数,n和m,其中1<=n<=100; 1<=m<=1000; 表示该无向图的节点数和边数。每个节点用1~n的整数编号。接下来的m行,每行包含两个整数:a, b, c,表示节点a, b之间的边的权值为c,其中1<=c<=1,000,000,0
00。数据保证不会出现自回边和重边。注意:具有相同权值的边不会超过10条。

Output

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

Sample Input

4 6
1 2 1
1 3 1
1 4 1
2 3 2
2 4 1
3 4 1

Sample Output

8

题目链接:

    http://www.lydsy.com/JudgeOnline/problem.php?id=1016

Solution

  首先可以发现在不同的最小生成树中,同权值的边的数量是一样的。。

  于是可以将每种权值的边的贡献分开算,然后用乘法原理就可以了。。

  对于某一种颜色,直接爆搜。。。感觉复杂度好像不太对。。。但是过了。。。

  算了反正都不知道多久之前写的了。。。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#define M 1010
#define mod 31011
using namespace std;
int n,m,cnt,tot;
int f[M],w[M],sum[M];
bool c[M];
struct edge{int l,r,w;
}e[M],a[M];
bool cmp(edge p,edge q){return p.w<q.w;}
int find(int x){if(f[x]==x) return f[x];return find(f[x]);
}
void RE(){for(int i=1;i<=n;i++) f[i]=i;}
void dfs(int x,int now,int k){if(now==a[x].r+1){if(k==a[x].w)tot++;return;}int xx=find(e[now].l),yy=find(e[now].r);if(xx!=yy){f[xx]=yy;dfs(x,now+1,k+1);f[xx]=xx;f[yy]=yy;}dfs(x,now+1,k);
}
int main(){int ans=1;cnt=0;tot=0;int xx,yy;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)scanf("%d%d%d",&e[i].l,&e[i].r,&e[i].w);sort(e+1,e+1+m,cmp);RE();for(int i=1;i<=m;i++){if(e[i].w!=e[i-1].w){a[cnt].r=i-1;cnt++;a[cnt].l=i;}xx=find(e[i].l);yy=find(e[i].r);if(xx!=yy){f[xx]=yy;a[cnt].w++;tot++;}}a[cnt].r=m;if(tot+1!=n){printf("0\n");return 0;}RE();for(int i=1;i<=cnt;i++){tot=0;dfs(i,a[i].l,0);ans=(ans*tot)%mod;for(int j=a[i].l;j<=a[i].r;j++){xx=find(e[j].l);yy=find(e[j].r);if(xx!=yy) f[xx]=yy;}}printf("%d\n",ans);return 0;
}

  

  

This passage is made by Iscream-2001.

转载于:https://www.cnblogs.com/Yuigahama/p/9671568.html

BZOJ 1016--[JSOI2008]最小生成树计数(kruskal搜索)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. 矩阵树定理--luoguP4208 [JSOI2008]最小生成树计数

    传送门 以前用dfsdfsdfs做的,用基尔霍夫矩阵真的玄啊 首先这道题有这么几个定理:(来自Z-Y-Y-S的博客) 定理一:如果 A,BA, BA,B 同为 GGG 的最小生成树,且 AAA 的边权 ...

最新文章

  1. Git相关二三事(git reflog 和彩色branch)【转】
  2. Java迭代器中的next()方法
  3. 论文盘点:CVPR 2019 - 文本检测专题
  4. js ajax 浏览器兼容,JS跨浏览器兼容,一点点总结
  5. 高仿微信对话列表滑动删除效果
  6. 关于 Docker ,你必须了解的核心都在这里了!
  7. 前端中对象的几种创建方式
  8. 转载 3年工作经验 面试大厂
  9. 五、会话及其会话技术
  10. C# SOCKE通信
  11. Python游戏编程入门-打飞机
  12. iweboffice文档内容服务器文件,iWebOffice2015使用常见问题-NTKOOffice文档控件.doc
  13. TCP的AIMD(加性增窗、乘性减窗)策略
  14. [语音处理] 声谱图(spectrogram)FBank(Mel_spectrogram)MFCC(Mel倒谱)到底用哪个作为NN输入?
  15. 开源中最好的Web开发资源汇总
  16. 数电6_1——时序逻辑电路概述(很久整理的,没有下文)
  17. 程序员必读的职业规划书,少走 5 年弯路(送书)
  18. pytorch RNN实现分类
  19. 广西大学oj1037(小西的c语言作业)
  20. Django的MVT的思路

热门文章

  1. SQL Server 查询表备注信息的语句
  2. 【Android Developers Training】 6. 配置Action Bar
  3. Windows Shell 编程 第六章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987951】...
  4. Ctrl+F5不能使用的问题
  5. 《Windows游戏编程大师技巧》三、Windows高级编程
  6. ES6-9 对象密封4种方式、assign、取值函数的拷贝
  7. LeetCode算法题-Factorial Trailing Zeroes(Java实现)
  8. vue学习之路.02
  9. Maven and Nexus2
  10. Java默认类型,类型转换,常量与变量笔记