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

题目:传送门

题解:

   神题神题%%%

   据说最小生成树有两个神奇的定理:

   1、权值相等的边在不同方案数中边数相等

      就是说如果一种方案中权值为1的边有n条

      那么在另一种方案中权值为1的边也一定有n条

   2、如果边权为1的边连接的点是x1,x2,x3

      那么另一种方案中边权为1的边连接的也一定是x1,x2,x3

  

   如果知道了这两条定理那就很好做了啊:

   因为等权边的条数一定,那么我们就可以预处理求出不同边权的边的条数

   题目很人道的保证了边权相同的边不会超过10条,那就可以光明正大的递归得出方案数了啊

  

   接下来就要利用定理2了:

   因为连接的点总是不变的,所以每一次选边是没有影响的,那么递归求出每一种权值边的方案数之后用乘法原理乘起来就ok

代码:

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define mod 31011
#define qread(x) x=read()
using namespace std;
inline int read()
{
int f=,x=;char ch;
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return f*x;
}
struct node
{
int x,y,c,next;
}a[];int n,m,sum;
int fa[];
int findfa(int x)
{
if(x==fa[x])return x;
return findfa(fa[x]);
}
bool cmp(node n1,node n2)
{
return n1.c<n2.c;
}
int d[],s[];
void dfs(int k,int t,int i)//当前选的是第k种边,已经选了t条,当前位置为第i条边
{
if(i==s[k]+)
{
if(t==d[k])
sum++,sum%=mod;
return ;
}
int fx=findfa(a[i].x),fy=findfa(a[i].y);
if(fx!=fy)
{
fa[fx]=fy;
dfs(k,t+,i+);
fa[fx]=fx;
}
dfs(k,t,i+);
}
int main()
{
qread(n);qread(m);
for(int i=;i<=m;i++){qread(a[i].x);qread(a[i].y);qread(a[i].c);}
sort(a+,a+m+,cmp);
for(int i=;i<=n;i++)fa[i]=i;
int k=,t=;memset(d,,sizeof(d));memset(s,,sizeof(s));
for(int i=;i<=m;i++)
{
int fx=findfa(a[i].x),fy=findfa(a[i].y);
if(a[i].c!=a[i-].c)s[k]=i-,k++;//记录第k种边的最后一个位置
if(fx!=fy)
{
fa[fx]=fy;
t++;d[k]++;
}
}
s[k]=m;
if(t!=n-){printf("0\n");return ;}
for(int i=;i<=n;i++)fa[i]=i;
int ans=;
for(int i=;i<=k;i++)
{
sum=;
dfs(i,,s[i-]+);
ans=(ans*sum)%mod;
for(int j=s[i-]+;j<=s[i];j++)
{
int fx=findfa(a[j].x),fy=findfa(a[j].y);
if(fx!=fy)fa[fx]=fy;
}
}
printf("%d\n",ans);
return ;
}

bzoj1016: [JSOI2008]最小生成树计数(kruskal+dfs)的更多相关文章

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

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

  2. [BZOJ1016] [JSOI2008] 最小生成树计数 (Kruskal)

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

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

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

  4. bzoj1016 [JSOI2008]最小生成树计数——Kruskal+矩阵树定理

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1016 从 Kruskal 算法的过程来考虑产生多种方案的原因,就是边权相同的边有一样的功能, ...

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

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

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

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

  7. bzoj1016: [JSOI2008]最小生成树计数(kruskal+dfs)

    一直以为这题要martix-tree,实际上因为有相同权值的边不大于10条于是dfs就好了... 先用kruskal求出每种权值的边要选的次数num,然后对于每种权值的边2^num暴搜一下选择的情况算 ...

  8. BZOJ1016:[JSOI2008]最小生成树计数(最小生成树,DFS)

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

  9. bzoj1016/luogu4208 最小生成树计数 (kruskal+暴搜)

    由于有相同权值的边不超过10条的限制,所以可以暴搜 先做一遍kruskal,记录下来每个权值的边使用的数量(可以离散化一下) 可以证明,对于每个权值,所有的最小生成树中选择的数量是一样的.而且它们连成 ...

随机推荐

  1. Linux 网络搭建

    如果系统环境崩溃.   调用/usr/bin/vim /etc/profile Windows    1 本地连接使用固定IP   vmware 8    2  修改Windows的hosts地址   ...

  2. 用LayerDrawable实现两个图片的叠加效果

    Drawable[] layers = new Drawable[2]; layers[0] = new ColorDrawable(primaryColor); layers[1] = new Co ...

  3. nmq 提交到 npm

    安装npm install nmq 源码:https://github.com/ronwe/nmq 此版本提供 pub/sub , 优化 pull

  4. hdu 5335 Walk Out 搜索+贪心

    Walk Out Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total S ...

  5. 朝花夕拾——finally/final/finalize拨云雾见青天

    Java编程中.常常会使用到异常处理,而finally看似的是try/catch后对逻辑处理的完好,事实上里面却存在非常多隐晦的陷阱.final常见于变量修饰,那么你在内部类中也见过吧.finaliz ...

  6. Java推断类和实例的关系

       通常我们使用instanceOf关键字来推断一个对象是否是类的实例,近期博主看到isInstance关键字,不解与instanceOf的差别,故度娘了一下,顺便涨了一下姿势.    Java中推 ...

  7. java web项目中资源国际化

    有一些网站会有语言栏选项: 选择英文,内容就显示为英文: 选择中文,内容就显示文中文. 这里就用到了国际化资源. 先看效果图: 步骤: 1.建立资源包: mess_en_US.properties ( ...

  8. 如何去掉边框及input的兼容问题?

    右偷个懒,发现别人写的也不错,我就做个小搬运工 如何去掉边框及input的兼容问题? 说到input,又不得不说它的兼容问题.input如何兼容各个浏览器呢? 第一步:清除input的border的默 ...

  9. 优动漫PAINT绘制紫阳花教程

    紫阳花是插画.漫画很常见的绘画画材.这个教程非常好懂.而且很方便就能绘制出漂亮的效果.因为这种花一个月内能变化三种颜色,故而人们赋予它的花语是善变.背叛. 教程是简单,呃.... 没有优动漫PAINT ...

  10. MVC 设计模式

    MVC 设计模式: 最早由 Trygve Teenskaug 在 1978 年提出,上世纪 80 年代是程序语言 Smalltalk 的一种内部架构.后来 MVC 被其他领域借鉴,成为了软件工程中的一 ...