BZOJ3141 Hnoi2013


Description

一个无向连通图,顶点从1编号到N,边从1编号到M。

小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数。当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和。

现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小。

Input

第一行是正整数N和M,分别表示该图的顶点数 和边数,接下来M行每行是整数u,v(1≤u,v≤N),表示顶点u与顶点v之间存在一条边。 输入保证30%的数据满足N≤10,100%的数据满足2≤N≤500且是一个无向简单连通图。

Output

仅包含一个实数,表示最小的期望值,保留3位小数。

Sample Input

3 3

2 3

1 2

1 3

Sample Output

3.333

HINT

边(1,2)编号为1,边(1,3)编号2,边(2,3)编号为3。


我们先把概率的DP转移方程列出来

发现因为是无向图,所以一定有方程转移是纠缠在一起的

然后我们就用高斯消元的方式解开方程组就可以得到答案了


#include<bits/stdc++.h>
using namespace std;
#define N 510
int n,m,out[N];
double p[N][N];
bool mp[N][N];
const double eps=1e-9;
struct Q{
int x,y;
double w;
}e[N*N];
bool cmp(const Q& a,const Q& b){
return a.w>b.w;
}
void gauss(int n,double a[N][N]){
for(int i=0;i<n;i++){
int r=i;
for(int j=i+1;j<n;j++)
if(fabs(a[j][i])>fabs(a[r][i]))r=j;
if(r!=i)for(int j=0;j<=n;j++)swap(a[r][j],a[i][j]);
for(int k=i+1;k<n;k++){
double f=a[k][i]/a[i][i];
for(int j=i;j<=n;j++)a[k][j]-=f*a[i][j];
}
}
for(int i=n-1;i>=0;i--){
for(int j=i+1;j<n;j++)
a[i][n]-=a[j][n]*a[i][j];
a[i][n]/=a[i][i];
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&e[i].x,&e[i].y);
e[i].x--;e[i].y--;
mp[e[i].x][e[i].y]=mp[e[i].y][e[i].x]=1;
out[e[i].x]++;
out[e[i].y]++;
}
n--;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(mp[i][j])p[i][j]=1.0/out[j];
for(int i=0;i<n;i++)
p[i][i]-=1;
p[0][n]=-1;
gauss(n,p);
for(int i=1;i<=m;i++)
e[i].w=p[e[i].x][n]/out[e[i].x]+p[e[i].y][n]/out[e[i].y];
sort(e+1,e+m+1,cmp);
double ans=0;
for(int i=1;i<=m;i++)
ans+=e[i].w*i;
printf("%.3lf",ans);
return 0;
}


BZOJ3141 Hnoi2013 游走 【概率DP】【高斯消元】*的更多相关文章

  1. BZOJ 3143: [Hnoi2013]游走 [概率DP 高斯消元]

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

  2. 【BZOJ3143】[Hnoi2013]游走 期望DP+高斯消元

    [BZOJ3143][Hnoi2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 ...

  3. BZOJ3143: [Hnoi2013]游走(期望DP 高斯消元)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3597  Solved: 1618[Submit][Status][Discuss] Descript ...

  4. BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)

    题目链接 参考 远航之曲 把走每条边的概率乘上分配的标号就是它的期望,所以我们肯定是把大的编号分配给走的概率最低的边. 我们只要计算出经过所有点的概率,就可以得出经过一条边(\(u->v\))的 ...

  5. bzoj 3143 [Hnoi2013]游走 期望dp+高斯消元

    [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3394  Solved: 1493[Submit][Status][Disc ...

  6. [HNOI2013] 游走 - 概率期望,高斯消元,贪心

    假如我们知道了每条边经过的期望次数,则变成了一个显然的贪心.现在考虑如何求期望次数. 由于走到每个点后各向等概率,很显然一条边的期望次数可以与它的两个端点的期望次数,转化为求点的期望次数 考虑每个点对 ...

  7. 2018.09.23 bzoj3143: [Hnoi2013]游走(dp+高斯消元)

    传送门 显然只需要求出所有边被经过的期望次数,然后贪心把边权小的边定城大的编号. 所以如何求出所有边被经过的期望次数? 显然这只跟边连接的两个点有关. 于是我们只需要求出两个点被经过的期望次数. 对于 ...

  8. bzoj3143 游走 期望dp+高斯消元

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

  9. 【洛谷3232】[HNOI2013] 游走(贪心+高斯消元)

    点此看题面 大致题意: 一个无向连通图,小\(Z\)从\(1\)号顶点出发,每次随机选择某条边走到下一个顶点,并将\(ans\)加上这条边的编号,走到\(N\)号顶点时结束.请你对边进行编号,使总分期 ...

  10. bzoj3143: [Hnoi2013]游走(贪心+高斯消元)

    考虑让总期望最小,那么就是期望经过次数越多的边贪心地给它越小的编号. 怎么求每条边的期望经过次数呢?边不大好算,我们考虑计算每个点的期望经过次数f[x],那么一条边的期望经过次数就是f[x]/d[x] ...

随机推荐

  1. python 这个stdin怎么写

    !/usr/bin/env python -- coding: utf-8 -- import json import pprint import sys reload(sys) sys.setdef ...

  2. 对spring boot 之AutoConfiguration 的理解

    来自:http://rensanning.iteye.com/blog/2363467 https://blog.csdn.net/tincox/article/details/79186067 Au ...

  3. TestNG,timeOut

    这篇先来介绍@Test注释下的一个属性-timeOut.字面意思就是超时判断,详细点说.如果哪个测试方法需要监听执行的时间,那么就可以考虑采用timeOut属性.例如,实际的接口测试中,加入登录接口时 ...

  4. Kubernetes服务目录的设计

    [编者的话]OpenShift 3.6新版本包括新的服务目录和服务中介技术预演版.它们是基于Kubernetes的孵化项目Kubernetes Service Catalog project.服务目录 ...

  5. css tips —— 在css中完成国际化

    前提 在日常处理国际化的时候,通常是将key通过类似intl.xx(key)转换为对应环境的文案,可是如果需要在css中加入对应逻辑应该怎么做呢(比如在after的伪元素中显示不同的文案),毕竟在cs ...

  6. pip 批量更新

    1. pip3 list --outdated >> requests  现将要更新的列表写入requests 2.对文件中的数据进行处理 Package        Version   ...

  7. 个人待办事项工具的设计和搭建(IFE前端2015春季 任务3)

    这是我几个月之前的项目作品,花了相当的时间去完善.博客人气不高,但拿代码的人不少,所以一直处于保密状态.没有公开代码.但如果对你有帮助,并能提出指导意见的,我将十分感谢. IFE前端2015春季 任务 ...

  8. 为什么CPU要从单核发展到多核?

    前言 这里首先直接给出结论:CPU从单核发展到多核的原因是如果维持单核,则为了提高CPU性能只能不断提高时钟频率,从而会导致CPU功耗急速上升,导致机箱过热,来不及散热. 历史 2004年,Intel ...

  9. 【转】 JavaScript:history.go() 的妙用(转) 处理post回发后返回

    在Web开发中,会遇到从一页(父页)导向另一页(子页),并且要求“返回”父页的情况,在这里如果用ASP.NET提供的 Response.Redirect()方法,往往不会达到理想的效果,例如:返回后, ...

  10. Highcharts 基本区域图;Highcharts 使用负数区域图;Highcharts 堆叠区域图;Highcharts 百分比堆叠区域图

    Highcharts 基本区域图 配置 chart chart.type 配置项用于设定图表类型,默认为 "line",本章节我们使用 'area'. var chart = { ...