LOJ #10070 最小生成树计数
一道mst……
最开始是毫无头绪,于是就点开了--->题解
大部分题解都是矩阵树……然而第一篇题解告诉了我们暴搜也能过(
思路大概是说,对于一个图\(G\),它的所有最小生成树的相同权值的边的数量是相等的。
(这里批评自己一下(虽然AC了但是最终没有证明这个思路的正确性()
(不过花了一些时间来尝试……最后没能成功举出反例,于是就默认这是对的了()
对边的权值排序,直接跑一遍mst,用结构体来记录相同权值的边出现的次数。然后暴搜一通边就完了qwq
神仙数据
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define mod 31011
#define MAXN 105
#define MAXM 1005
using namespace std;
struct segm
{
int u,v,w;
}e[MAXM];
struct sums
{
int l,r,value;
}a[MAXM];
int n,m,f[MAXN],toti=0,tot=0,sum,ans=1;
int find(int q)
{
if (q==f[q]) return q;
return find(f[q]);
}
bool cmp(segm x,segm y)
{
return x.w<y.w;
}
void dfs(int wei,int cur,int del)
{
if (cur==a[wei].r+1)
{
if (del==a[wei].value)
{
sum++;
}
return;
}
int xx=find(e[cur].u),yy=find(e[cur].v);
if (xx!=yy)
{
f[xx]=yy;
dfs(wei,cur+1,del+1);
f[xx]=xx; f[yy]=yy;
}
dfs(wei,cur+1,del);
return;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
f[i]=i;
}
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
}
sort(e+1,e+m+1,cmp);
for (int i=1;i<=m;i++)
{
if (e[i].w!=e[i-1].w)
{
a[tot].r=i-1;
a[++tot].l=i;
}
int xx=find(e[i].u),yy=find(e[i].v);
if (xx!=yy)
{
f[xx]=yy;
a[tot].value++;
toti++;
}
}
if (toti!=n-1)
{
printf("0");
return 0;
}
a[tot].r=m;
for (int i=1;i<=n;i++)
{
f[i]=i;
}
for (int i=1;i<=tot;i++)
{
sum=0;
dfs(i,a[i].l,0);
ans=(ans*sum)%mod;
for (int j=a[i].l;j<=a[i].r;j++)
{
int xx=find(e[j].u),yy=find(e[j].v);
if (xx!=yy)
{
f[xx]=yy;
}
}
}
printf("%d",ans);
return 0;
}
LOJ #10070 最小生成树计数的更多相关文章
- 最小生成树计数 bzoj 1016
最小生成树计数 (1s 128M) award [问题描述] 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一 ...
- 【bzoj1016】 JSOI2008—最小生成树计数
http://www.lydsy.com/JudgeOnline/problem.php?id=1016 (题目链接) 题意 求图的最小生成树计数. Solution %了下题解,发现要写矩阵树,15 ...
- [BZOJ]1016 JSOI2008 最小生成树计数
最小生成树计数 题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同 ...
- bzoj1016 [JSOI2008]最小生成树计数
1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3517 Solved: 1396[Submit][St ...
- 【BZOJ】【1016】【JSOI2008】最小生成树计数
Kruskal/并查集+枚举 唉我还是too naive,orz Hzwer 一开始我是想:最小生成树删掉一条边,再加上一条边仍是最小生成树,那么这两条边权值必须相等,但我也可以去掉两条权值为1和3的 ...
- 【BZOJ】1016: [JSOI2008]最小生成树计数 深搜+并查集
最小生成树计数 Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小 ...
- BZOJ_1016_[JSOI2008]_最小生成树计数_(dfs+乘法原理)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1016 给出一张图,其中具有相同权值的边的数目不超过10,求最小生成树的个数. 分析 生成树的计 ...
- BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )
不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...
- 1016: [JSOI2008]最小生成树计数
1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 6200 Solved: 2518[Submit][St ...
随机推荐
- Cassandra数据模型
Ⅰ.数据模型 1.1 Column 一组包含Name/Value Pair的数据叫Row,其中每一组Name/Value Pair叫Column Column是Cassandra最基本的数据结构,它是 ...
- 阿里云入坑指南&&nodejs 安装配置
买了阿里云1G1核1M的机器(800元,3年) 登录阿里云-实例-选择实例所在地区-重置密码 用公网IP ssh连接 #升级CentOS yum -y update #安装or更新组件 yum -y ...
- [math] 什么是双曲函数(转发)
我完全不记得上高中的时候学习过双曲函数...额,暴露了... 原文地址:https://zhuanlan.zhihu.com/p/20042215 可能是最好的讲解双曲函数的文章 零.写在前面 (近期 ...
- js 自动类型转换
js自动类型转换 1.==符号在判断左右两边数据是否相等时,如果数据类型一致,直接比较值即可 2.==符号左右数据类型不一致时,如果两方数据为布尔型.数值型.字符串型时,不为数字的那一方自动调用Num ...
- python学习笔记3-列表
# 1.列表长度可变,内容可修改 a = [0,1,2,3] a[0] = 'a0' a # ['a0', 1, 2, 3] # 2.添加元素 # 2.1列表末尾添加元素 a.append(4) a ...
- 【Git】修改git远程连接ip
- layer倒计时弹框/弹层 DEMO
layer.msg("提示语...", { time: 5000, shade: 0.6, success: function (layero, index) { var msg ...
- 放弃antd table,基于React手写一个虚拟滚动的表格
缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反 ...
- PS跑马灯效果和更换图标
最终效果 1.图片修改 跑马灯效果图 Head页面 使用的 IScript_HPDefaultHdr() in WEBLIB_PORTAL.PORTAL_HOMEPAGE 这个页面 一 ...
- 对于Java Bean的类型转换问题()使用 org.apache.commons.beanutils.ConvertUtils)
在进行与数据库的交互过程中,由数据库查询到的数据放在 map 中,由 map 到 JavaBean 的过程中可以使用 BeanUtils.populate(map,bean)来进行转换 这里要处理的问 ...