题目描述

给出一张无向图,求满足 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. 一篇SSM框架整合友好的文章(二)

    上一篇讲述了DAO 层,mybatis实现数据库的连接,DAO层接口设计,以及mybtis和spring的整合.DAO层采用接口设计方式实现,接口和SQL实现的分离,方便维护.DAO层所负责的仅仅是接 ...

  2. java基础必备单词讲解 day five

    Rectangle width high height area employee tool param version author math guess resources 之前单词复习 path ...

  3. 键盘遮挡控件(textfield/textview.......)

    采用的是通知的常规方式 // 解决键盘遮挡问题//选择didShow是因为需要键盘的高度//选择willHide是因为视图frame重置需要优先于键盘消失,否则表现得不连贯 [[NSNotificat ...

  4. JS浏览器的三种弹框:

    1.alert:使用alert弹框提示信息,最后都会被转化为字符串输出(因为调用了toString这个方法).比如alert(1+1)弹出的结果应该是字符串形式的“2”. 2.Confirm:在ale ...

  5. Redis高可用

    redis高可用只要在于三个方面 主从复制 哨兵机制 集群机制 主从复制 主从复制作用: 1.数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式.2.故障恢复:当主节点出现问题时,可 ...

  6. Selenium页面加载策略

    https://blog.csdn.net/wkb342814892/article/details/81611737 https://blog.csdn.net/ouyanggengcheng/ar ...

  7. linux连接FreeBSD虚拟机的mysql

    前言 本人菜鸟一枚,第一次写博客,不喜误喷. 实验环境 Opensuse15.0(主机).FreeBSD11.1(虚拟机).虚拟机VirtualBox5.2.22.mysql8.0.14 在FreeB ...

  8. 交换机基础配置之单交换机划分vlan

    我们以以上拓扑图为例 pc0的IP地址为:192.168.1.1 pc1的ip地址为:192.168.1.2 两台主机在同一网段,相互ping是能ping通的 我们的目的是在单交换机上划分两个vlan ...

  9. js字节转换、字节格式化函数

    有时候在上传附件后需要显示大小,可以选择在后台处理,也可以在前台用js处理. 比如我们想1024MB转换成1GB,那就需要进行转换,这里只是介绍用js进行转换. function bytesToSiz ...

  10. 在唯一密钥属性“fileExtension”设置为“.”时,无法添加类型为“mimeMap”的重复集合项

    在ASP.NET 网站的配置文件中添加了MIME类型,但是运行网站后在IIS上和页面上提示"在唯一密钥属性“fileExtension”设置为“.woff”时,无法添加类型为“mimeMap ...