题目描述

给出一张无向图,求满足 0号点到所有点的路径长等于原图中它们之间最短路 的生成树的个数。

输入

第一行一个整数N,代表原图结点。
接下来N行,每行N个字符,描绘了一个邻接矩阵。邻接矩阵中,
如果某一个元素为0,代表这两个点之间不存在边,
并且保证第i行第i列的元素为0,第i行第j列的元素(i≠j)等于第j行第i列的元素。
2≤N≤50

输出

一行一个整数,代表删法总方案数膜1,000,000,007的结果。

样例输入

4
0123
1012
2101
3210

样例输出

6


题解

最短路+矩阵树定理

首先求出这张图以0为起点的最短路径图,即边只能在这些图中选择。这里由于数据范围小,随便哪种最短路都可以。代码中写了Floyd。

然后考虑一个点是从哪个个节点更新的:最短路径图上指向它的所有边都可以选择。(注意:最短路径图是有向的。即如果a能更新b则有a->b,不代表b能更新a。)

所以答案就是最短路径图上以0为根的生成外向树形图的数目。求 入度矩阵-邻接矩阵 删去0所在行列的行列式的值即为答案。

时间复杂度$O(n^3)$

UPD:我SB了。。。能直接求出的干嘛要用矩阵树定理。。。

由于最短路径图是一个DAG,因此相当于除了1号点以外,其它点选择其入边的任意一条均可(类似于归纳法),所以答案就是最短路径图中除了一号点以外其它所有的点的入度之积。

(转化为矩阵树定理,即如果按照拓扑序给点编号的话,相当于得到的矩阵是一个上三角矩阵,直接求对角线(入度)乘积即为答案)。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 50
#define mod 1000000007
using namespace std;
typedef long long ll;
int map[N][N] , dis[N][N];
ll a[N][N];
char str[60];
inline ll pow(ll x , int y)
{
ll ans = 1;
while(y)
{
if(y & 1) ans = ans * x % mod;
x = x * x % mod , y >>= 1;
}
return ans;
}
int main()
{
int n , i , j , k , d = 0;
ll t , ans = 1;
scanf("%d" , &n);
memset(map , 0x3f , sizeof(map)) , memset(dis , 0x3f , sizeof(dis));
for(i = 0 ; i < n ; i ++ )
{
scanf("%s" , str) , dis[i][i] = 0;
for(j = 0 ; j < n ; j ++ )
if(str[j] != '0')
map[i][j] = dis[i][j] = str[j] - '0';
}
for(k = 0 ; k < n ; k ++ )
for(i = 0 ; i < n ; i ++ )
for(j = 0 ; j < n ; j ++ )
dis[i][j] = min(dis[i][j] , dis[i][k] + dis[k][j]);
for(i = 0 ; i < n ; i ++ )
for(j = 0 ; j < n ; j ++ )
if(map[i][j] != 0x3f3f3f3f && dis[0][i] + map[i][j] == dis[0][j])
a[j][j] ++ , a[i][j] = (a[i][j] - 1 + mod) % mod;
for(i = 1 ; i < n ; i ++ )
{
for(j = i ; j < n ; j ++ )
if(a[i][j])
break;
if(j == n) continue;
if(j != i)
{
d ^= 1;
for(k = i ; k < n ; k ++ ) swap(a[i][k] , a[j][k]);
}
ans = ans * a[i][i] % mod;
for(t = pow(a[i][i] , mod - 2) , j = i ; j < n ; j ++ )
a[i][j] = a[i][j] * t % mod;
for(j = i + 1 ; j < n ; j ++ )
for(t = a[j][i] , k = i ; k < n ; k ++ )
a[j][k] = (a[j][k] - a[i][k] * t % mod + mod) % mod;
}
for(i = 1 ; i < n ; i ++ ) ans = ans * a[i][i] % mod;
if(d) ans = (mod - ans) % mod;
printf("%lld\n" , ans);
return 0;
}

【bzoj5056】OI游戏 最短路+矩阵树定理的更多相关文章

  1. BZOJ5056 OI游戏 最短路+组合数学

    链接接接接接! 正解:最短路+小学奥数 乘法原理 解题报告: 首先读懂题意(,,,我觉得我吃枣死于语文太差读不懂题目QAQ 大意就是港,要求从第一个点到其他各点的长度都是最短的方案有多少个(ummm, ...

  2. 【BZOJ4894】天赋(矩阵树定理)

    [BZOJ4894]天赋(矩阵树定理) 题面 BZOJ Description 小明有许多潜在的天赋,他希望学习这些天赋来变得更强.正如许多游戏中一样,小明也有n种潜在的天赋,但有 一些天赋必须是要有 ...

  3. 【bzoj4894】天赋 矩阵树定理

    题目描述 小明有许多潜在的天赋,他希望学习这些天赋来变得更强.正如许多游戏中一样,小明也有n种潜在的天赋,但有一些天赋必须是要有前置天赋才能够学习得到的.也就是说,有一些天赋必须是要在学习了另一个天赋 ...

  4. LOJ #6044 -「雅礼集训 2017 Day8」共(矩阵树定理+手推行列式)

    题面传送门 一道代码让你觉得它是道给初学者做的题,然鹅我竟没想到? 首先考虑做一步转化,我们考虑将整棵树按深度奇偶性转化为一张二分图,即将深度为奇数的点视作二分图的左部,深度为偶数的点视作二分图的右部 ...

  5. [spoj104][Highways] (生成树计数+矩阵树定理+高斯消元)

    In some countries building highways takes a lot of time... Maybe that's because there are many possi ...

  6. BZOJ 4766: 文艺计算姬 [矩阵树定理 快速乘]

    传送门 题意: 给定一个一边点数为n,另一边点数为m,共有n*m条边的带标号完全二分图$K_{n,m}$ 求生成树个数 1 <= n,m,p <= 10^18 显然不能暴力上矩阵树定理 看 ...

  7. bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 559  Solved: 325[Submit][Sta ...

  8. 【LOJ#6072】苹果树(矩阵树定理,折半搜索,容斥)

    [LOJ#6072]苹果树(矩阵树定理,折半搜索,容斥) 题面 LOJ 题解 emmmm,这题似乎猫讲过一次... 显然先\(meet-in-the-middle\)搜索一下对于每个有用的苹果数量,满 ...

  9. 2019.01.02 bzoj2467: [中山市选2010]生成树(矩阵树定理)

    传送门 矩阵树定理模板题. 题意简述:自己看题面吧太简单懒得写了 直接构建出这4n4n4n个点然后按照题面连边之后跑矩阵树即可. 代码: #include<bits/stdc++.h> # ...

随机推荐

  1. JSPatch库, 一个Apple官方支持的实现在线更新iOS应用的库

    简介 项目主页: https://github.com/bang590/JSPatch 示例下载: https://github.com/ios122/ios122 JSPatch 可以让你用 Jav ...

  2. ARM S3C2440 时钟初始化流程

    1.设置lock time 2.设置分频系数 3.设置CPU到异步工作模式 4.设置 FCLK 了解 芯片的时钟原理图,以及寄存器的作用 了解芯片的晶振频率,锁相环,分频系数,以及有哪些时钟

  3. yarn 无法下载node-sass

    指定node-sass的下载源 yarn config set sass-binary-site http://npm.taobao.org/mirrors/node-sass

  4. html页面 加载完成后再刷新 一次

    主要用于第一次加载页面有部分加载bug,再刷新一次即可正常运行. 简单粗暴直接上代码,不带参数,0影响 <Script>function refresh(){ url = location ...

  5. 关于对GitHub的使用

    什么是GitHub? GitHub是版本控制和协作的代码托管平台.它可以让你在其他人在任何地方一起工作. 本文主要向您介绍GitHub essentials,如存储库,分支,提交和合并请求.将您创建自 ...

  6. busybox编译 fatal error: curses.h: 没有那个文件或目录解决办法

    执行make menuconfig时出现如下错误@ubuntu:/home/dev/busybox-1.19.3# make menuconfig HOSTCC scripts/kconfig/lxd ...

  7. impala presto SparkSql性能测试对比

      目标是为测试impala presto SparkSql谁的性能更佳,以下结果底层查询的都是普通textfile snappy压缩后数据,规模为15台机器,若以orcfile.parquet速度能 ...

  8. [Azure Storage]使用Java上传文件到Storage并生成SAS签名

    Azure官网提供了比较详细的文档,您可以参考:https://azure.microsoft.com/en-us/documentation/articles/storage-java-how-to ...

  9. MySQL之查询性能优化(四)

    优化特定类型的查询 COUNT()的作用 COUNT()是一个特殊函数,有两个非常不同的作用:它可以统计某个列值的数量,也可以统计行数.在统计列值时要求列值是非空的(不统计NULL). 如果在COUN ...

  10. (B)springboot配置开发和测试环境并添加启动路径

    嗯,开发和测试环境要分离,这是一般共识(虽然我工作过的公司都没有这种分离),spring boot也可以按照配置文件的读取来做到这一点. 上图有三个application开头的配置文件,要达到能够读取 ...