洛谷 P4455 [CQOI2018]社交网络(矩阵树定理,求行列式)

24人阅读 评论(0) 收藏 举报
分类:

题面

题意

给出一个DAG,求以1为根的生成树的个数.

做法

这题的关键是要知道矩阵树定理,就是说对于一幅图,构造出其邻接矩阵和入度矩阵(对角线上为每个点的入度),并用入度矩阵减去邻接矩阵得到的矩阵的行列式即为答案.
矩阵的行列式就是对于所有种每行每列各选取一个元素的积的和,具体而言,对于三阶矩阵a,其行列式为:
a[1][1]*a[2][2]*a[3][3]+
a[1][1]*a[2][3]*a[3][2]+
a[1][2]*a[2][1]*a[3][3]+
a[1][2]*a[2][3]*a[3][1]+
a[1][3]*a[2][1]*a[3][2]+
a[1][3]*a[2][2]*a[3][1]
且行列式满足交换任意两行或两列,其行列值变为原来的相反数的性质,因此可以用高斯消元求解,因为高斯消元不改变原来矩阵的行列式(除了其中的换行操作),而且高斯消元后的矩阵为一个上三角矩阵(仅对角线与上,右边界组成的三角形内的数可能不为零),其行列式就变为了对角线上所有数的乘积.这样就能O(n^3)求矩阵的行列式了.

代码

#include<iostream>
#include<cstdio>
#define ll long long
#define N 300
#define M 10007
using namespace std;

ll n,m,a[N][N],ans=1;

inline ll ny(ll u)
{
    ll v=M-2,res=1;
    for(;v;)
    {
        if(v&1) res=res*u%M;
        u=u*u%M;
        v>>=1;
    }
    return res;
}

inline void xy()
{
    ll i,j,k,tmp;
    bool sw=0;
    for(i=1;i<=n;i++)
    {
        for(j=i;j<=n;j++) if(a[j][i]) break;
        if(i!=j) {for(k=i;k<=n;k++) swap(a[i][k],a[j][k]);sw^=1;}
        for(j=i+1;j<=n;j++)
        {
            tmp=a[j][i]*ny(a[i][i]);
            for(k=i;k<=n;k++)
            {
                a[j][k]=(a[j][k]-tmp*a[i][k]%M+M)%M;
            }
        }
    }
    for(i=1;i<=n;i++) ans=ans*a[i][i]%M;
    if(sw&&ans) ans=M-ans;
}

int main()
{
    ll i,j,p,q;
    cin>>n>>m;
    for(i=1;i<=m;i++)
    {
        scanf("%lld%lld",&p,&q);
        a[q][p]--;
        a[p][p]++;
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            a[i][j]=a[i][j+1];
        }
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            a[i][j]=a[i+1][j];
        }
    }
    n--;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            a[i][j]=(a[i][j]+M)%M;
        }
    }
    xy();
    cout<<ans;
}
查看评论

机器学习之矩阵

-
  • 1970年01月01日 08:00

[BZOJ5297][CQOI2018]社交网络(Matrix-Tree定理)

5297: [Cqoi2018]社交网络Time Limit: 20 Sec&amp;nbsp;&amp;nbsp;Memory Limit: 512 MBSubmit: 20&amp;nbsp;&a...
  • Effervescence
  • Effervescence
  • 2018-04-17 19:39:14
  • 71

洛谷 P4455 [CQOI2018]社交网络(矩阵树定理)

题目描述传送门大意:给出n个点的有向图,求以1为根的树形图个数。(1≤n≤250)思路有向图的基尔霍夫定理。类比无向图生成树的计算方式,先根据原图构出基佬♂霍夫矩阵。呸!是基尔霍夫矩阵。无向图中为度数...
  • Ab_Ever
  • Ab_Ever
  • 2018-04-23 09:51:02
  • 25

CQOI2018 总结!

省选挂掉,北大一本线飞了。。。 Day0 重邮终于换考场了,在一个奇怪的二维码大楼,然而电脑没换。。我电脑居然跑得超慢,A+B编译一分钟,右键菜单卡半分钟,打字更不上我的速度。。。什么垃圾电脑...
  • can919
  • can919
  • 2018-04-15 16:53:44
  • 182

【总结】CQOI2018爆炸记

Day0 各种模板都背得差不多了,下午去看了考场,路上教练说可能我们最近OI赛制的比赛打得很少,估计会有影响,要多注意。(flag高高悬起) 听LJH大爷,码了一发FFT一发NTT让这俩货对拍,键...
  • qq_34454069
  • qq_34454069
  • 2018-04-16 14:45:59
  • 148

【BZOJ5297】【CQOI2018】社交网络(矩阵树定理)

题面BZOJ 洛谷Description当今社会,在社交网络上看朋友的消息已经成为许多人生活的一部分。通常,一个用户在社交网络上发布一条消息(例如微博、状态、Tweet等)后,他的好友们也可以看见这...
  • qq_30974369
  • qq_30974369
  • 2018-04-21 10:18:34
  • 17

Destruction of a Tree CodeForces - 964D

题面题意给出一棵树,你可以摧毁其中度数为偶数的点,同时与之相连的点将被一起摧毁,问能否摧毁所有点,若能,还要输出方案.做法首先可以发现点数为偶数的肯定不行,因为每次删除偶数条边,因此对于一对父子,若子...
  • yzyyylx
  • yzyyylx
  • 2018-04-18 14:02:31
  • 161

Matrix-Tree定理和模意义下的矩阵行列式

进入以查看文章
  • u013010295
  • u013010295
  • 2015-08-12 21:20:12
  • 2985

生成树计数问题——矩阵树定理及其证明

生成树计数问题给一副n个节点的无向图G,求一个包含n-1条边的边集使得边集的边构成一颗树,问这样的边集的数量。矩阵树定理以下我们都不对重边与自环进行讨论。 先定义度数矩阵D,是一个n*n的矩阵。 ...
  • WerKeyTom_FTD
  • WerKeyTom_FTD
  • 2017-02-07 20:01:43
  • 4149

bzoj2467 生成树 Matrix-tree定理

http://www.lydsy.com/JudgeOnline/problem.php?id=2467 不知道为什么,一看到这道题就果断想到了Maxtrix-tree定理,然后搞kirchho...
  • nikelong0
  • nikelong0
  • 2016-03-25 16:33:55
  • 794
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 2072
    排名: 2万+
    文章存档
    最新评论