【BZOJ5056】OI游戏 最短路+有向图生成树计数
【BZOJ5056】OI游戏
Description
Input
Output
Sample Input
2
01
10
Input2
4
0123
1012
2101
3210
Sample Output
1
Output2
6
题解:一开始看错题,以为是任意两点间的最短路都相同。。。
先求出1号点到所有点的最短路径图(如果1到所有点的最短路径都可能经过某条边,则这条边在最短路径图上)(注意这个图是有向的)(可以用SPFA或Dij,不过本人懒,用的Floyd)。然后我们只需要求出这个图的生成树个数了。由于要求的是外向树,所以用度数矩阵-邻接矩阵,再用辗转相除得到行列式的值即可。具体做法可以参见天赋那道题。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const ll P=1000000007;
int n;
char str[60];
int dis[60][60],map[60][60];
ll v[60][60],A,B;
ll ans;
int main()
{
scanf("%d",&n);
int i,j,k;
for(i=1;i<=n;i++)
{
scanf("%s",str+1);
for(j=1;j<=n;j++) dis[i][j]=str[j]-'0',map[i][j]=dis[i][j]=(!dis[i][j]&&i!=j)?(0x3f3f3f3f):dis[i][j];
}
for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i!=j)
{
if(dis[1][i]+map[i][j]==dis[1][j]) v[j][j]++,v[i][j]--;
}
for(i=1;i<=n;i++) for(j=1;j<=n;j++) v[i][j]=(v[i][j]+P)%P;
ans=1;
for(i=2;i<=n;i++)
{
for(j=i;j<=n;j++) if(v[j][i]) break;
if(j!=i) for(ans=P-ans,k=i;k<=n;k++) swap(v[i][k],v[j][k]);
for(j=i+1;j<=n;j++)
{
A=v[i][i],B=v[j][i];
while(B)
{
ll tmp=A/B,temp=A; A=B,B=temp%B;
for(ans=P-ans,k=i;k<=n;k++) v[i][k]=(v[i][k]-v[j][k]*tmp%P+P)%P,swap(v[i][k],v[j][k]);
}
}
ans=ans*v[i][i]%P;
}
printf("%lld",ans);
return 0;
}
【BZOJ5056】OI游戏 最短路+有向图生成树计数的更多相关文章
- BZOJ5056 OI游戏 最短路+组合数学
链接接接接接! 正解:最短路+小学奥数 乘法原理 解题报告: 首先读懂题意(,,,我觉得我吃枣死于语文太差读不懂题目QAQ 大意就是港,要求从第一个点到其他各点的长度都是最短的方案有多少个(ummm, ...
- 【bzoj5056】OI游戏 最短路+矩阵树定理
题目描述 给出一张无向图,求满足 0号点到所有点的路径长等于原图中它们之间最短路 的生成树的个数. 输入 第一行一个整数N,代表原图结点. 接下来N行,每行N个字符,描绘了一个邻接矩阵.邻接矩阵中, ...
- 【BZOJ4894】天赋 有向图生成树计数
[BZOJ4894]天赋 Description 小明有许多潜在的天赋,他希望学习这些天赋来变得更强.正如许多游戏中一样,小明也有n种潜在的天赋,但有一些天赋必须是要有前置天赋才能够学习得到的.也就是 ...
- BZOJ5056 OI游戏[最短路树]
有生以来做过的bzoj比A+B还简单的最水的题.(确信) 不解释. UPD:据说这题正解应当是矩阵树定理?但是这个不是用来最小生成树计数的么?有生之年会补的. #include<iostream ...
- @总结 - 7@ 生成树计数 —— matrix - tree 定理(矩阵树定理)与 prüfer 序列
目录 @0 - 参考资料@ @0.5 - 你所需要了解的线性代数知识@ @1 - 矩阵树定理主体@ @证明 part - 1@ @证明 part - 2@ @证明 part - 3@ @证明 part ...
- bzoj 5056: OI游戏 最短路树的计数
OI游戏 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 196 Solved: 159[Submit][Status][Discuss] Descrip ...
- bzoj 5056: OI游戏
5056: OI游戏 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 204 Solved: 162[Submit][Status][Discuss] D ...
- kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数
第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一 ...
- 生成树计数 Matrix-Tree 定理 学习笔记
一直都知道要用Matrix-Tree定理来解决生成树计数问题,但是拖到今天才来学.博主数学不好也只能跟着各位大佬博客学一下它的应用以及会做题,证明实在是不会. 推荐博客: https://www.cn ...
随机推荐
- jQuery 创建html
jQuery 创建html
- ipv6 dns list
ip v6 DNS list: 将首选DNS服务器地址填上2001:778::37 备用DNS服务器地址填上2001:df8:0:7::1
- 访问vector元素方法的效率比较(转)
LInux下: gcc 4.47,red hat6 #include<iostream> #include<vector> #include<time.h> usi ...
- 对非正确使用浮点型数据而导致项目BUG的问题探讨
乘法分配律 在上小学的时候就已经学习过乘法分配律,乘法分配律的详细内容是:两个数的和与一个数相乘.能够先把他们分别与这个数相乘,再相加.得数不变.乘法分配律的定义还能够用表达式"(a+b)× ...
- SSH 基于ajax实现修改密码功能步骤梳理
1. 为密码输入框进行输入校验,使用easyUI提供的easyui-validatebox <table cellpadding=3> <tr> <td>新密码:& ...
- 数据库面试题.net
1.ADO.net中常用的对象 connection, command, sqladapter, dataset, dataview. 2.net中读写数据库要用到哪些类 DataSet数据存储 Da ...
- RabbitMQ 学习笔记(一)特点
RabbitMQ 的具体特点 可靠性: RabbitMQ 使用一些机制来保证可靠性, 如持久化.传输确认及发布确认等. 令灵活的路由: 在消息进入队列之前,通过交换器来路由消息.对于典型的路由功能,R ...
- phpExcel常用方法详解【附有php导出excel加超级链接】
phpExcel常用方法详解[附有php导出excel加超级链接] 发表于4年前(-- :) 阅读() | 评论() 0人收藏此文章, 我要收藏 赞0 http://www.codeplex.com/ ...
- code::blocks怎么设置命令行参数
Project->Set Program's Arguments...然后在相应的输入框中输入命令行参数
- Vue 组件6内联模板
如果子组件有inline-template特性,组件将把它的内容当做模板,而不是把它当做分发内容,这样模板更灵活. <my-component inline-template> <d ...