【BZOJ3143】【HNOI2013】游走 高斯消元
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3143
我们令Pi表示从第i号点出发的期望次数。则Pn显然为0。
对于P2 Pn−1,则有Pi=∑Pjdj,其中节点j与节点i有边相连,dj表示节点j的度数。
对于P1,则有Pi=1+∑Pjdj。
不难发现其实就是一个n元一次方程组,我们可以通过高斯消元求出每一个Pi。
对于一条边(x,y),经过这条边的期望次数为Pxdx+Pydy,我们设此值为pi 。
我们把期望经过次数从大到小排序,则答案为∑ni=1pi×i。
然后就做完了。
AC代码如下:
1 #include<bits/stdc++.h> 2 #define M 505 3 using namespace std; 4 int a[M][M]={0},n,m; 5 double f[M][M]={0},p[M]={0},du[M]={0}; 6 7 void solve(){ 8 for(int i=1;i<=n;i++){ 9 for(int j=i+1;j<=n;j++){ 10 double x=f[j][i]/f[i][i]; 11 for(int k=i;k<=n+1;k++) 12 f[j][k]-=x*f[i][k]; 13 } 14 } 15 for(int i=n;i;i--){ 16 for(int j=i+1;j<=n;j++) 17 f[i][n+1]-=f[i][j]*p[j]; 18 p[i]=f[i][n+1]/f[i][i]; 19 } 20 } 21 int X[M*M]={0},Y[M*M]={0}; double hh[M*M]={0}; 22 int main(){ 23 scanf("%d%d",&n,&m); 24 for(int i=1;i<=m;i++){ 25 int x,y; scanf("%d%d",&x,&y); 26 a[x][y]=a[y][x]=1; 27 du[x]++; du[y]++; 28 X[i]=x; Y[i]=y; 29 } 30 f[1][n+1]=-1; f[n][n]=1; 31 for(int i=1;i<n;i++){ 32 f[i][i]=-1; 33 for(int j=1;j<=n;j++) if(a[i][j]) 34 f[i][j]=1/du[j]; 35 } 36 solve(); 37 for(int i=1;i<=m;i++) 38 hh[i]=p[X[i]]/du[X[i]]+p[Y[i]]/du[Y[i]]; 39 sort(hh+1,hh+m+1); 40 double ans=0; 41 for(int i=1;i<=m;i++) 42 ans+=hh[i]*(m-i+1); 43 printf("%.3lf\n",ans); 44 }
分类:
高斯消元
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!