博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 5297: [Cqoi2018]社交网络
阅读量:4322 次
发布时间:2019-06-06

本文共 1294 字,大约阅读时间需要 4 分钟。

Description

当今社会,在社交网络上看朋友的消息已经成为许多人生活的一部分。通常,一个用户在社交网络上发布一条消息

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

Solution

\(Matrix-tree\) 板子题

对于有向图注意度数矩阵是入度矩阵
删除的必须是第一行和第一列

#include
using namespace std;const int N=255,mod=10007;int a[N][N],n,m;inline void solve(){ int ans=1; for(int i=2;i<=n;i++){ for(int j=i+1;j<=n;j++){ while(a[j][i]){ int t=a[i][i]/a[j][i]; for(int k=i;k<=n;k++){ a[i][k]=(a[i][k]-a[j][k]*t)%mod; swap(a[i][k],a[j][k]); } ans=(mod-ans)%mod; } } ans=ans*a[i][i]%mod; } if(ans<0)ans+=mod; printf("%d\n",ans);}int main(){ freopen("pp.in","r",stdin); freopen("pp.out","w",stdout); int x,y; cin>>n>>m; for(int i=1;i<=m;i++){ scanf("%d%d",&x,&y); a[x][x]++;a[y][x]--; } solve(); return 0;}

转载于:https://www.cnblogs.com/Yuzao/p/8884307.html

你可能感兴趣的文章
“==”运算符与equals()
查看>>
单工、半双工和全双工的定义
查看>>
Hdu【线段树】基础题.cpp
查看>>
时钟系统
查看>>
BiTree
查看>>
5个基于HTML5的加载动画推荐
查看>>
水平权限漏洞的修复方案
查看>>
静态链接与动态链接的区别
查看>>
Android 关于悬浮窗权限的问题
查看>>
如何使用mysql
查看>>
linux下wc命令详解
查看>>
敏捷开发中软件测试团队的职责和产出是什么?
查看>>
在mvc3中使用ffmpeg对上传视频进行截图和转换格式
查看>>
python的字符串内建函数
查看>>
Spring - DI
查看>>
微软自己的官网介绍 SSL 参数相关
查看>>
Composite UI Application Block (CAB) 概念和术语
查看>>
64位MATLAB和C混合编程以及联合调试
查看>>
原生js大总结二
查看>>
PHP基础
查看>>