这道题主要利用了最小生成树的两个性质

  1. 最小生成树每种边权的数目固定不变

  2. 最小生成树每种边权带来的连通状况一定唯一

由于每种边权的只有不到10种,所以直接穷举然后乘法原理即可

 const mo=;
type node=record
       x,y,w:longint;
     end; var a:array[..] of node;
    fa,rank,v:array[..] of longint;
    sum,ans,k1,k2,s,i,j,n,m,p,k:longint; function getf(x:longint):longint;
  begin
    if fa[x]<>x then fa[x]:=getf(fa[x]);
    exit(fa[x]);
  end; procedure swap(var a,b:node);
  var c:node;
  begin
    c:=a;
    a:=b;
    b:=c;
  end; procedure sort(l,r:longint);
  var i,j,x,y:longint;
  begin
    i:=l;
    j:=r;
    x:=a[(l+r) shr ].w;
    repeat
      while a[i].w<x do inc(i);
      while x<a[j].w do dec(j);
      if not(i>j) then
      begin
        swap(a[i],a[j]);
        inc(i);
        j:=j-;
      end;
    until i>j;
    if l<j then sort(l,j);
    if i<r then sort(i,r);
  end; function calc(x:longint):longint;
  begin
    calc:=;
    while x> do
    begin
      calc:=calc+x mod ;
      x:=x shr ;
    end;
  end; function check(p,cur:longint):longint;
  var i,res,tot:longint;
  begin
    for i:= to n do
      fa[i]:=i;
    tot:=;
    res:=;
    for i:=p to j- do
    begin
      if cur and = then
      begin
        k1:=getf(a[i].x);
        k2:=getf(a[i].y);
        if k1<>k2 then
        begin
          fa[k1]:=k2;
          inc(tot);
          res:=res+a[i].w;
        end;
      end;
      cur:=cur shr ;
    end;
    for i:= to m do
    begin
      if a[i].w=a[j-].w then continue;
      k1:=getf(a[i].x);
      k2:=getf(a[i].y);
      if k1<>k2 then
      begin
        fa[k1]:=k2;
        inc(tot);
        res:=res+a[i].w;
      end;
    end;
    if (res=sum) and (tot=n-) then exit() else exit();
  end; begin
  readln(n,m);
  for i:= to m do
    readln(a[i].x,a[i].y,a[i].w);
  sort(,m);
  for i:= to n do
    fa[i]:=i;
  rank[]:=;
  p:=;
  for i:= to m do
  begin
    if a[i].w<>a[i-].w then inc(p);
    rank[i]:=p;
  end;
  i:=;
  j:=;
  while i<n- do
  begin
    inc(j);
    k1:=getf(a[j].x);
    k2:=getf(a[j].y);
    if k1<>k2 then
    begin
      fa[k1]:=k2;
      inc(i);
      inc(v[rank[j]]);
      sum:=sum+a[j].w;
    end;
  end;
  if i<n- then
  begin
    writeln();
    halt;
  end;
  ans:=;
  i:=;
  while i<=m do
  begin
    j:=i+;
    while a[i].w=a[j].w do inc(j);
    if v[rank[i]]> then
    begin
      s:=;
      for k:= to shl (j-i)- do
        if calc(k)=v[rank[i]] then s:=s+check(i,k);
      ans:=ans*s mod mo;
    end;
    i:=j;
  end;
  writeln(ans);
end.

bzoj1016的更多相关文章

  1. 【bzoj1016】 JSOI2008—最小生成树计数

    http://www.lydsy.com/JudgeOnline/problem.php?id=1016 (题目链接) 题意 求图的最小生成树计数. Solution %了下题解,发现要写矩阵树,15 ...

  2. 【Matrix-tree定理】【并查集】【kruscal算法】bzoj1016 [JSOI2008]最小生成树计数

    题意:求一个图的最小生成树个数. 矩阵树定理:一张无向图的生成树个数 = (度数矩阵 - 邻接矩阵)的任意一个n-1主子式的值. 度数矩阵除了对角线上D[i][i]为i的度数(不计自环)外,其他位置是 ...

  3. [BZOJ1016][JSOI2008]最小生成树计数(结论题)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1016 分析: 首先有个性质:如果边集E.E'都可以表示一个图G的最小生成树(当然E和E ...

  4. BZOJ1016 最小生成树计数

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

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

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

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

    思路:模拟kruskal的过程,可以发现对于所有权值相同的边,有很多种选择的方案,而且权值不同的边并不会相互影响,因为先考虑权值较小的边,权值比当前权值大的边显然不在考虑范围之内,而权值比当前权值小的 ...

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

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

  8. 【BZOJ1016】【JSOI2008】最小生成树计数

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

  9. 【最小生成树】BZOJ1016: [JSOI2008]最小生成树计数

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

随机推荐

  1. WildFly 9.0.2 启用 SSL

    一.最近做个项目是需要在WildFly中启用https,但是由于WildFly的中文文档比较少所以google了一下,先是通过JBOSS的官方文档了解了一下,但是官方文档这块的配置介绍有些不全面.所以 ...

  2. spring mvc源码解析

    1.从DispatcherServlet开始 与很多使用广泛的MVC框架一样,SpringMVC使用的是FrontController模式,所有的设计都围绕DispatcherServlet 为中心来 ...

  3. jQuery如何阻止子元素继承父元素事件?

    <a> <b></b> </a> $("a").click(...); 这种绑定的话,b也会响应一次事件,如何只对a元素绑定事件,而 ...

  4. 【C++11】新特性——Lambda函数

    本篇文章由:http://www.sollyu.com/c11-new-lambda-function/ 文章列表 本文章为系列文章 [C++11]新特性--auto的使用 http://www.so ...

  5. ubuntu 13.10自定义启动顺序

    添加PPA sudo add-apt-repository ppa:danielrichter2007/grub-customizer sudo apt-get update sudo apt-get ...

  6. 【CF493E】【数学】Vasya and Polynomial

    Vasya is studying in the last class of school and soon he will take exams. He decided to study polyn ...

  7. 九度OJ 1373 整数中1出现的次数(从1到n整数中1出现的次数)

    题目地址:http://ac.jobdu.com/problem.php?pid=1373 题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU ...

  8. Python没有执行__init__

    疑惑 提出问题 前天同事问我一个问题,为什么这个脚本中的没有调用A 的__init__.脚本如下: class A(object): def __init__(self, *args, **kwarg ...

  9. 网站开发常用jQuery插件总结(14)图片修剪插件Jcrop

    一.插件功能 用于对图片进行修剪.但是在使用Jcrop时,还需要配合服务器端开发语言(如asp.net,php等)使用. 二.官方地址 http://deepliquid.com/content/Jc ...

  10. 【转】oracle PLSQL常用方法汇总

    原文:http://www.cnblogs.com/luluping/archive/2010/03/10/1682885.html 在SQLPLUS下,实现中-英字符集转换alter session ...