题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3143

(luogu) https://www.luogu.org/problemnew/show/P3232

题解: 水题。考虑如何求每个点的期望经过次数: 要求\(1\)号点开始\(n\)号点结束,那么\(1\)号点一定一上来就会经过一次,\(n\)号点一共只会经过\(1\)次。因此对于\(1\)到\(n-1\)的每一个点可以列出一个方程,其中\(1\)号点的方程是\(f[1]=\sum_{edge(u,1),1\le u\le n-1} \frac{f[u]}{du[u]}+1\) (\(du\)为度数), 其余点\(v\)的方程是\(f[v]=\sum_{edge(u,v),1\le u\le n-1} \frac{f[u]}{du[u]}\). 这个方程组有\((n-1)\)个未知数\((n-1)\)个方程,解出来即可。\(n\)号点怎么办?如果列出来其实应该是\(f[n]=\sum_{edge(u,n)} \frac{f[u]}{du[u]}=1\), 但是发现这个方程等价于前\((n-1)\)个方程加起来,所以就不用管了。

我们得到了每个点的期望经过次数,然后就可以轻易得到每条边期望经过次数,对于边\((u,v)\)其期望经过次数为\(\frac{f[u]}{du[u]}+\frac{f[v]}{du[v]}\), 其中\(f[n]\)视为\(0\). 根据期望的线性性,总得分期望就等于每条边期望经过次数乘以边权再求和,所以根据排序不等式给期望次数越小的边安排越大的边权即可。

时间复杂度\(O(n^3+m\log m)\).

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<iostream>
#include<algorithm>
using namespace std; inline int read()
{
int x=0; bool f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
if(f) return x;
return -x;
} const int N = 500;
namespace Gauss
{
double a[N+3][N+3],b[N+3],sol[N+3];
void gauss(int n)
{
for(int i=1; i<=n; i++)
{
if(a[i][i]==0)
{
bool found = false;
for(int j=i+1; j<=n; j++)
{
if(a[i][j]!=0)
{
for(int k=i; k<=n; k++) swap(a[i][k],a[j][k]);
swap(b[j],b[i]);
found = true; break;
}
}
if(!found) continue;
}
for(int j=i+1; j<=n; j++)
{
if(a[j][i]!=0)
{
double coe = -a[j][i]/a[i][i];
for(int k=i; k<=n; k++) {a[j][k] += coe*a[i][k];}
b[j] += coe*b[i];
}
}
}
for(int i=n; i>=1; i--)
{
for(int j=i+1; j<=n; j++)
{
b[i] -= a[i][j]*sol[j];
}
sol[i] = b[i]/a[i][i];
}
}
}
struct AEdge
{
int u,v;
} e[N*N+3];
int du[N+3];
double f[N+3];
double coe[N*N+3];
int permu[N*N+3];
int n,m,en; bool cmp(int x,int y) {return coe[x]>coe[y];} int main()
{
scanf("%d%d",&n,&m);
for(int i=1; i<=m; i++)
{
scanf("%d%d",&e[i].u,&e[i].v);
du[e[i].u]++; du[e[i].v]++;
}
for(int i=1; i<n; i++) Gauss::a[i][i] = -1.0;
for(int i=1; i<=m; i++)
{
int u = e[i].u,v = e[i].v;
if(u==n || v==n) continue;
Gauss::a[u][v] += 1.0/du[v]; Gauss::a[v][u] += 1.0/du[u];
}
Gauss::b[1] = -1.0;
Gauss::gauss(n-1);
for(int i=1; i<n; i++) f[i] = Gauss::sol[i];
for(int i=1; i<=m; i++)
{
int u = e[i].u,v = e[i].v;
coe[i] = f[u]/du[u]+f[v]/du[v];
}
for(int i=1; i<=m; i++) permu[i] = i;
sort(permu+1,permu+m+1,cmp);
double ans = 0.0;
for(int i=1; i<=m; i++) {ans += coe[permu[i]]*i;}
printf("%.3lf\n",ans);
return 0;
}

BZOJ 3143 Luogu P3232 [HNOI2013]游走 (DP、高斯消元)的更多相关文章

  1. 洛谷P3232 [HNOI2013]游走(高斯消元+期望)

    传送门 所以说我讨厌数学……期望不会高斯消元也不会……好不容易抄好了高斯消元板子被精度卡成琪露诺了…… 首先,我们先算出走每一条边的期望次数,那么为了最小化期望,就让大的期望次数乘上小编号 边的期望次 ...

  2. 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元

    [题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...

  3. [BZOJ3143][HNOI2013]游走(期望+高斯消元)

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3576  Solved: 1608[Submit][Status ...

  4. BZOJ3143 [Hnoi2013]游走 【高斯消元】

    题目 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编 ...

  5. [luogu3232 HNOI2013] 游走 (高斯消元 期望)

    传送门 题目描述 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等 ...

  6. [HNOI2013]游走 期望+高斯消元

    纪念首道期望题(虽说绿豆蛙的归宿才是,但是我打的深搜总觉得不正规). 我们求出每条边的期望经过次数,然后排序,经过多的序号小,经过少的序号大,这样就可以保证最后的值最小. 对于每一条边的期望经过次数, ...

  7. bzoj 3143 [Hnoi2013]游走【高斯消元+dp】

    参考:http://blog.csdn.net/vmurder/article/details/44542575 和2337有点像 设点u的经过期望(还是概率啊我也分不清,以下都分不清)为\( x[u ...

  8. 【BZOJ3143】游走(高斯消元,数学期望)

    [BZOJ3143]游走(高斯消元,数学期望) 题面 BZOJ 题解 首先,概率不会直接算... 所以来一个逼近法算概率 这样就可以求出每一条边的概率 随着走的步数的增多,答案越接近 (我卡到\(50 ...

  9. LOJ 2542 「PKUWC2018」随机游走 ——树上高斯消元(期望DP)+最值反演+fmt

    题目:https://loj.ac/problem/2542 可以最值反演.注意 min 不是独立地算从根走到每个点的最小值,在点集里取 min ,而是整体来看,“从根开始走到点集中的任意一个点就停下 ...

随机推荐

  1. locust 的几种写法及部分内容说明

    第一种 **********************************   from locust import  HttpLocust, TaskSet, task import  json ...

  2. Luogu P1948 [USACO08JAN]Telephone Lines

    题目 两眼题 二分一个\(lim\),然后跑最短路(边权\(\le lim\)的边长度为\(0\),\(>lim\)的长度为\(1\)),然后判断\(dis_{1,n}\le k\). #inc ...

  3. python-day8(正式学习)

    目录 列表类型内置方法 常用操作+内置方法 优先掌握(***) 需要掌握(**) 存一个值or多个值 有序or无序 可变or不可变 元组类型内置方法 定义 常用操作+内置方法 优先掌握 一个值or多个 ...

  4. Django 前端通过json 取出后端数据

    Django 前端通过json 取出后端数据 前端通过json 取出后端数据 步骤1:后台数据通过 JSON 序列化成字符串a 注意:1.json是1个字符串 ​ 2.通过json.dumps('xx ...

  5. Bootstrap4中栅格系统CSS中 col-sm-* col-md-* col-lg-*的意义以及当其同时具有col-xs-* col-sm-* col-md-* col-lg-*的含义

    根据Bootstrap--Grid 中 col-sm-* col-md-* col-lg-* col-xl-*的意义: .col-sm-* 小屏幕 手机 (≥ 576px) .col-md-* 中等屏 ...

  6. vue-mixins和vue高阶组件

    我们在开发过程中,因为需求的变更,往往会遇见对现有组件的改造和扩展. 那么我们有什么方法对现有组件进行改造和扩展呢? 常见的我们可以使用mixins方式 下面就让我们来看一下怎么使用mixins方式对 ...

  7. npm切换淘宝镜像源

    npm 切换到淘宝源地址默认的npm下载地址:http://www.npmjs.org/淘宝npm镜像的地址:https://npm.taobao.org/ 临时使用淘宝源npm --registry ...

  8. redis数据库到mysql或mongodb数据库

    # -*- coding:utf-8 -*-# item_mongodb.py import redis import pymongo import json def main(): redis_co ...

  9. 23_1spring基础

    1.spring是什么 2.spring的优势 3.spring体系结构 4.耦合 程序间的依赖关系:类之间的依赖和方法之间的依赖. 解构:降低程序间的依赖关系. 实际开发中应该做到:编译期不依赖,实 ...

  10. Codeforces 981 共同点路径覆盖树构造 BFS/DP书架&最大值

    A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_bac ...