4894: 天赋

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 191  Solved: 150
[Submit][Status][Discuss]

Description

小明有许多潜在的天赋,他希望学习这些天赋来变得更强。正如许多游戏中一样,小明也有n种潜在的天赋,但有
一些天赋必须是要有前置天赋才能够学习得到的。也就是说,有一些天赋必须是要在学习了另一个天赋的条件下才
能学习的。比如,要想学会"开炮",必须先学会"开枪"。一项天赋可能有多个前置天赋,但只需习得其中一个就可
以学习这一项天赋。上帝不想为难小明,于是小明天生就已经习得了1号天赋-----"打架"。于是小明想知道学习完
这n种天赋的方案数,答案对1,000,000,007取模。

Input

第一行一个整数n。
接下来是一个n*n的01矩阵,第i行第j列为1表示习得天赋j的一个前置天赋为i。
数据保证第一列和主对角线全为0。
n<=300

Output

第一行一个整数,问题所求的方案数。

Sample Input

8
01111111
00101001
01010111
01001111
01110101
01110011
01111100
01110110

Sample Output

72373

解析    本题其实就是求以1为起点  外向生成树的个数   还是用基尔霍夫满矩阵来写

定理题,证明过程比较难,记下结论吧

有向树:对于一个有向图,如果无视边的方向是一棵树,那么此有向图就称为有向树

外向树:有向树的特殊情况,下同,所有边的方向都是从根指向叶子

内向树:所有边的方向都是从叶子指向根

对于n个点的有向图,求出外向生成树个数:(其实就是这道题)

①先定义一个n*n的矩阵,a[i][i]初始化为i点的入度其它为0

②如果存在一条i到j的边,那么a[i][j]-1,最后删掉根的那一行和那一列

③求出对应(n-1)*(n-1)的行列式的值就是答案

对于有向图求内向生成树的个数只要将入度换成出度计算方式一样

  1. #include <bits/stdc++.h>
  2. #define pb push_back
  3. #define mp make_pair
  4. #define fi first
  5. #define se second
  6. #define all(a) (a).begin(), (a).end()
  7. #define fillchar(a, x) memset(a, x, sizeof(a))
  8. #define huan printf("\n");
  9. #define debug(a,b) cout<<a<<" "<<b<<" ";
  10. using namespace std;
  11. typedef long long ll;
  12. const int maxn=,maxm=,inf=0x3f3f3f3f;
  13. const ll mod=;
  14. ll a[maxn][maxn];
  15. ll det(int n)
  16. {
  17. ll ans = ;
  18. for (int i = ; i <= n; i++)
  19. {
  20. for (int j = i + ; j <= n; j++)
  21. {
  22. while (a[j][i] != )
  23. {
  24. ll u = a[i][i] / a[j][i];
  25. for (int k = i; k <= n; k++)
  26. {
  27. ll t = (a[i][k] - (ll)a[j][k] * u % mod + mod)% mod;
  28. a[i][k] = a[j][k];
  29. a[j][k] = t;
  30. }
  31. ans = -ans;
  32. }
  33. }
  34. ans = ans * a[i][i]% mod;
  35. }
  36. if (ans < )
  37. {
  38. //ans=-ans;
  39. ans += mod;
  40. }
  41. return ans;
  42. }
  43. char s[];
  44. int main()
  45. {
  46. int n;
  47. scanf("%d",&n);
  48. for(int i=;i<=n;i++)
  49. {
  50. scanf("%s",s+);
  51. for(int j=;j<=n;j++)
  52. if(s[j]=='')
  53. a[j][i]--,a[j][j]++;
  54. }
  55. printf("%lld\n",det(n));
  56. }

BZOJ 4894 有向图 外向生成树个数的更多相关文章

  1. BZOJ.4894.天赋(Matrix Tree定理 辗转相除)

    题目链接 有向图生成树个数.矩阵树定理,复习下. 和无向图不同的是,度数矩阵改为入度矩阵/出度矩阵,分别对应外向树/内向树. 删掉第i行第i列表示以i为根节点的生成树个数,所以必须删掉第1行第1列. ...

  2. 【BZOJ】3994: [SDOI2015]约数个数和

    题意: \(T(1 \le T \le 50000)\)次询问,每次给出\(n, m(1 \le n, m \le 50000)\),求\(\sum_{i=1}^{n} \sum_{j=1}^{m} ...

  3. bzoj:3994:vijos1949: [SDOI2015]约数个数和

    Description  设d(x)为x的约数个数,给定N.M,求     Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M.   O ...

  4. [SDOI2015][bzoj 3994][Luogu P3327] 约数个数和 (莫比乌斯反演)

    题目描述 设d(x)d(x)d(x)为xxx的约数个数,给定NNN.MMM,求 ∑i=1N∑j=1Md(ij)\sum^{N}_{i=1}\sum^{M}_{j=1} d(ij)i=1∑N​j=1∑M ...

  5. bzoj 4894: 天赋

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

  6. bzoj 1015 维护连通块个数,离线并查集

    水. /************************************************************** Problem: 1015 User: idy002 Langua ...

  7. [bzoj4766]文艺计算姬——完全二分图生成树个数

    Brief Description 求\(K_{n,m}\) Algorithm Design 首先我们有(Matrix Tree)定理,可以暴力生成几组答案,发现一些规律: \[K_{n,m} = ...

  8. zoj 3471 Most Powerful (有向图)最大生成树 状压dp

    题目链接 题意 \(N\)种气体,\(i\)气体与\(j\)气体碰撞会: 产生\(a[i][j]\)的威力: 导致\(j\)气体消失. 求产生威力之和的最大值. 思路 和前几题找图上路径的题不一样,该 ...

  9. 有向图欧拉回路个数 BEST定理

    有向图欧拉回路个数 BZOJ 3659 但是没有这道题了  直接贴一个别人的板子吧 欧拉回路:存在一条路径经过所有的边刚好1次 有向图欧拉回路存在充要条件:①图连通:②对于所有点都满足出度=入度 BE ...

随机推荐

  1. String 截取字符串#中间的文本

    通过正则实现: String regex = "#([^#]+)#"; @Test public void test() { String text = "#中俄建交七十 ...

  2. laravel之伪造跨站请求保护CSRF实现机制

    Laravel 提供了简单的方法使你的应用免受 跨站请求伪造 (CSRF) 的袭击.跨站请求伪造是一种恶意的攻击,它凭借已通过身份验证的用户身份来运行未经过授权的命令. Laravel 为每个活跃用户 ...

  3. Java之流水号生成器实现

    参考:https://www.jianshu.com/p/331b872e9c8f 1.建立一张存放的表 CREATE TABLE `sys_serial_number` ( `id` bigint( ...

  4. Python3中的输入输出

    input()函数 我们可以通过Python3解释器查看Python3中input()的含义: >>> type(input) <class 'builtin_function ...

  5. New Arrival MB SD Connect Compact 5 (MB SD C4) Star Diagnosis

    MB SD Connect Compact 5 has same function as SD C4 but with new design, support both cars and trucks ...

  6. java内存模型(线程共享部分)

    1.元空间(MetaSpace)与永久代(PermGen)的区别? ----> 1.1 元空间使用的是本机内存(这样的好处是,可以使用的内存空间变大了,没有OutOfMemoryError:Pe ...

  7. adb 调试真机 wait for device 错误解决办法

    起因 真机测试,使用adb安装和卸载应用时,出现wait for device. 解决办法 拔掉USB重新插入即可.

  8. layui二次封装

    最近一直用layui进行页面的重构,这个框架十分适合我们后台人员开发.简单易用,但是layui本身不支持双向绑定,所以很多情况下,我们在支持动态的控件加载时,需要反复刷新.这里我自己封装了一个comm ...

  9. UVALive - 6275 Joint Venture (二分)

    题意: 给定一个整数w, 然后给定n个数, 问有没有两个数之和恰好为w 分析: 现将n个数数组a[]排序, 然后用两个变量i,j指向开头和末尾, 如果a[i] + a[j] > w, i++, ...

  10. javaweb 开发所需工具和入门教程文档等

    下载网址 1.JDK1.8下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.ht ...