CQOI2018 Day1 社交网络

原创 2018年04月17日 19:59:51

Cqoi2018 Day1 社交网络

题目背景:

当今社会,在社交网络上看朋友的消息已经成为许多人生活的一部分。通常,一个用户在社交网络上发布一条消息(例如微博、状态、Tweet等)后,他的好友们也可以看见这条消息,并可能转发。转发的消息还可以继续被人转发,进而扩散到整个社交网络中。

题目描述:

在一个实验性的小规模社交网络中我们发现,有时一条热门消息最终会被所有人转发。为了研究这一现象发生的过程,我们希望计算一条消息所有可能的转发途径有多少种。为了编程方便,我们将初始消息发送者编号为1,其他用户编号依次递增。该社交网络上的所有好友关系是已知的,也就是说对于A、B两个用户,我们知道A用户可以看到B用户发送的消息。注意可能存在单向的好友关系,即A能看到B的消息,但B不能看到A的消息。还有一个假设是,如果某用户看到他的多个好友转发了同一条消息,他只会选择从其中一个转发,最多转发一次消息。从不同好友的转发,被视为不同的情况。如果用箭头表示好友关系,下图展示了某个社交网络中消息转发的所有可能情况。这里写图片描述

输入输出个数:

输入格式:

输入文件第一行,为一个正整数n,表示社交网络中的用户数:
第二行为一个正整数m.表示社交网络中的好友关系数目。
接下来m行,每行为两个空格分隔的整数ai和bi,表示一组好友关系,即用户ai可以看到用户bi发送的消息。1≤n≤250,1≤ai,bi≤n,1≤m≤n(n-1)

输出格式:
输出文件共一行,为一条消息所有可能的转发途径的数量,除以1 0007所得的余数。

分析:

看到题目后发现这道题目就是一个裸的生成树技术的问题啊,然后我们就会想到这题用矩阵树来解决了。详情见:矩阵树。蒟蒻并不会证明矩阵树,只能在这里大致的讲一讲题目的方法。大概就是构建一个度数矩阵D,D[i][i]记录第i个点的入度,其余的为0,然后再构建一个邻接矩阵A,A[i][j]表示从i到j是否存在一条边,存在就为1,否则为0。然后我们就可以得到矩阵树的关键矩阵:基尔霍夫矩阵C=D-A。然后我们在定义一个余子式M[i][j]表示A去掉第i行与第j列后的行列式。通过一系列的证明可以得出基尔霍夫矩阵任意一个余子式就是生成树的个数。然后这题就会变得非常简单了,构建出这个基尔霍夫矩阵,求出余子式的值就行了。最后不要忘记高斯消元的时候记得是在模意义下的就行了。具体的见代码。

Code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool Finish_read;
template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;}
template<class T>inline void print(T x){if(x/10!=0)print(x/10);putchar(x%10+'0');}
template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('\n');}
template<class T>inline void write(T x){if(x<0)putchar('-');x=abs(x);print(x);}
/*================Header Template==============*/
const int maxn=255;
const int Md=10007;
ll D[maxn][maxn],C[maxn][maxn],A[maxn][maxn];
int n,m;
/*==================Define Area================*/
ll GetInv(ll x) {
    ll ans=1;
    ll y=Md-2;
    while(y) {
        if(y&1) ans*=x,ans%=Md;
        x*=x;
        x%=Md;
        y>>=1;
    }
    return ans;
}

int Gauss(ll A[255][255],int n) {
    int i,j,k,r;
    int f=1;
    for(i=1;i<=n;i++) {
        r=i;
        for(j=i+1;j<=n;j++) {
            if(A[j][i]>A[r][i]) r=j;
        }
        if(r!=i) {
            for(j=1;j<=n;j++) {
                swap(A[r][j],A[i][j]);
            }
            f*=-1;
        }
        for(k=i+1;k<=n;k++) {
            int f=1ll*A[k][i]*GetInv(A[i][i])%Md;//注意是在模意义下的
            for(j=i;j<=n;j++) {
                A[k][j]=((A[k][j]-1ll*f*A[i][j]%Md)%Md+Md)%Md;
            }
        }
    }
    int ans=1;
    for(int i=1;i<=n;i++) {
        ans*=A[i][i];
        ans%=Md;
    }
    ans=(f*ans%Md+Md)%Md;//最后求出余子式的值
    return ans%Md;
}  

int main() {
    read(n);read(m);
    for(int i=1;i<=m;i++) {
        int u,v;
        read(u);read(v);
        D[u][u]++;
        C[v][u]=1;
    }
    for(int i=1;i<n;i++) {
        for(int j=1;j<n;j++) {
            A[i][j]=D[i+1][j+1]-C[i+1][j+1];
        }
    }//构建出基尔霍夫矩阵
    ll res=Gauss(A,n-1);
    printf("%lld\n",res);
    return 0;
}
版权声明:大佬神犇们随便转载吧,只要附上链接就行了~ https://blog.csdn.net/czl_233/article/details/79979856

大数据第一季--Hadoop(day1)

-
  • 1970年01月01日 08:00

CQOI2018

如何评价CQOI2018? - SunIsMe的回答 - 知乎 https://www.zhihu.com/question/272299188/answer/367549534 现在个人博客重新...
  • qq_35479641
  • qq_35479641
  • 2018-04-15 19:10:22
  • 233

CQOI2018 总结!

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

【总结】CQOI2018爆炸记

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

CQOI2016游记

前情提要:我是丝薄,noip405的丝薄,所以这次省选特别虚 day0 上午随便切了两个题,背了下版。 下午看考场,环境还好,键盘也不错,评测姬非常好,就是人和人之间有点近,我回去买了耳塞(虽然...
  • Quack_quack
  • Quack_quack
  • 2016-04-10 23:06:44
  • 1074

[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
  • 66

[bzoj4815][CQOI2017]小Q的表格

题目描述小Q是个程序员。 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理。每当小Q不知道如何解决 时,就只好向你求助。为了完成任务,小Q需要列一个表格,表格有无穷...
  • WerKeyTom_FTD
  • WerKeyTom_FTD
  • 2017-06-16 17:12:32
  • 388

【CQOI 2016】不同的最小割

题目描述给定一个nn个点mm条边的网络流,问两两点对之间不同的最小割数目。n≤850,m≤8500n\leq 850, m\leq 8500分析最小割树。考虑任意取出两个点x,yx, y,求出任意一个...
  • Yves___
  • Yves___
  • 2016-04-24 08:45:03
  • 415

JZOJ 3596. 【CQOI2014】和谐矩阵

Description 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本身,及他上下左右的4个元素(如果存在)。 给定矩阵的行数和列数,请计算并...
  • liyizhixl
  • liyizhixl
  • 2018-01-06 20:33:02
  • 104

[CQOI2018] 社交网络

题目描述: 求有向图中以1为根的有根树的数量 题目分析: 矩阵树定理. 有向图的建法就是跟无向图的差不多 u-&amp;gt;v a[u][v]– a[v][v]++ 求以一为根的有根树,要...
  • qq_35914587
  • qq_35914587
  • 2018-04-21 09:44:48
  • 16
收藏助手
不良信息举报
您举报文章:CQOI2018 Day1 社交网络
举报原因:
原因补充:

(最多只允许输入30个字)