bzoj3143 游走 期望dp+高斯消元
题意:
一个无向连通图,顶点从1编号到N,边从1编号到M。
小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数。当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和。
现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小。
思路:很显然,我们肯定希望经过次数最多的边的标号最小,但是由于边的数量可能很多,而且好像也不存在什么很好转移的东西,那么我们就需要考虑点。
假设E[X]代表从x这个点出发的次数,那么对于{u,v}这样一条边的被经过的次数显然等于$\frac{E[u]}{deg[u]}+\frac{E[v]}{deg[v]}$ deg代表度数,也就是从其他点过来的概率。所以我们只要算出E[x]就可以完成这道题了。
我们考虑一般的u(除了起点和终点),显然易得$E[X]=\sum \frac {E[v]}{deg[v]}$。
而终点就是的E[X]就是0,起点的期望,除了上述的式子,还需要加入最初始的1.(游戏开局),由于我们这样可以得到n个式子,而且n个式子之间存在推来推去的关系,显然可以考虑高斯消元。
所以就按照上面这个式子高斯消元求解,然后把边按经过次数排序就是答案了。
- #pragma GCC optimize (2)
- #pragma G++ optimize (2)
- #pragma comment(linker, "/STACK:102400000,102400000")
- #include<bits/stdc++.h>
- #define rep(i,a,b) for(int i=a;i<=b;i++)
- #define dep(i,b,a) for(int i=b;i>=a;i--)
- #define clr(a,b) memset(a,b,sizeof(a))
- #define pb push_back
- #define pii pair<int,int >
- using namespace std;
- typedef long long ll;
- ll rd()
- {
- ll x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
- return x*f;
- }
- const int maxn=;
- const int inf=0x3f3f3f3f;
- int T,n,m;
- vector<int >ve[maxn];
- struct edge{
- int u,v;
- double g;
- friend bool operator<(const edge &a,const edge &b){
- return a.g>b.g;
- }
- }e[maxn*maxn];
- const double eps=1e-;
- int equ=,var=;
- double a[maxn][maxn],x[maxn],deg[maxn];
- int Gauss()//高斯消元 返回 0 无解 返回 1有解
- {
- int i,j,k,col,max_r;
- for(k=,col=;k<equ&&col<var;k++,col++)
- {
- max_r=k;
- for(i=k+;i<equ;i++)
- if(fabs(a[max_r][col])>fabs(a[max_r][col]))
- max_r=i;
- if(fabs(a[max_r][col])<eps) return ;
- if(k!=max_r)
- {
- for(j=col;j<var;j++)
- swap(a[k][j],a[max_r][j]);
- swap(x[k],x[max_r]);
- }
- x[k]/=a[k][col];
- for(j=col+;j<var;j++) a[k][j]/=a[k][col];
- a[k][col]=;
- for(i=;i<equ;i++)
- {
- if(i!=k)
- {
- x[i]-=x[k]*a[i][col];
- for(j=col+;j<var;j++) a[i][j]-=a[k][j]*a[i][col];
- a[i][col]=;
- }
- }
- }
- return ;
- }
- int main(){
- cin>>n>>m;
- rep(i,,m){
- scanf("%d%d",&e[i].u,&e[i].v);
- deg[e[i].u]++;
- deg[e[i].v]++;
- ve[e[i].u].push_back(e[i].v);
- ve[e[i].v].push_back(e[i].u);
- }
- x[]=;
- a[n-][n-]=;
- equ=var=n+;
- rep(i,,n-){
- a[i-][i-]=;
- //for(auto &v:ve[i]){
- for(int j=;j<ve[i].size();j++){
- int v=ve[i][j];
- if(v!=n)
- a[i-][v-]=-/deg[v];
- }
- }
- Gauss();
- for(int i=;i<=m;i++){
- e[i].g=;
- if(e[i].u!=n)
- e[i].g+=x[e[i].u-]/deg[e[i].u];
- if(e[i].v!=n)
- e[i].g+=x[e[i].v-]/deg[e[i].v];
- }
- sort(e+,e++m);
- double ans=;
- rep(i,,m){
- ans+=i*e[i].g;
- }
- printf("%.3f\n",ans);
- }
bzoj3143 游走 期望dp+高斯消元的更多相关文章
- 【BZOJ3143】[Hnoi2013]游走 期望DP+高斯消元
[BZOJ3143][Hnoi2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 ...
- BZOJ3143: [Hnoi2013]游走(期望DP 高斯消元)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3597 Solved: 1618[Submit][Status][Discuss] Descript ...
- bzoj 3143 [Hnoi2013]游走 期望dp+高斯消元
[Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3394 Solved: 1493[Submit][Status][Disc ...
- 2018.09.23 bzoj3143: [Hnoi2013]游走(dp+高斯消元)
传送门 显然只需要求出所有边被经过的期望次数,然后贪心把边权小的边定城大的编号. 所以如何求出所有边被经过的期望次数? 显然这只跟边连接的两个点有关. 于是我们只需要求出两个点被经过的期望次数. 对于 ...
- BZOJ 3143: [Hnoi2013]游走 [概率DP 高斯消元]
一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ...
- BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元
BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...
- bzoj3143: [Hnoi2013]游走(贪心+高斯消元)
考虑让总期望最小,那么就是期望经过次数越多的边贪心地给它越小的编号. 怎么求每条边的期望经过次数呢?边不大好算,我们考虑计算每个点的期望经过次数f[x],那么一条边的期望经过次数就是f[x]/d[x] ...
- 期望dp+高斯消元——bzoj3143
比较经典的题,题解看网上的..https://www.cnblogs.com/GXZlegend/p/7054536.html 自己sort弄错了..还以为是高斯消元写歪了.. #include< ...
- 【noi2019集训题1】 脑部进食 期望dp+高斯消元
题目大意:有n个点,m条有向边,每条边上有一个小写字母. 有一个人从1号点开始在这个图上随机游走,游走过程中他会按顺序记录下走过的边上的字符. 如果在某个时刻,他记录下的字符串中,存在一个子序列和S2 ...
随机推荐
- 实习记——《Rethink》
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gmszone/article/details/30045055 最终能够在和自己的电脑上写下这些字了 ...
- Puppeteer自动化批量上传抖音视频
前言:最近因为项目宣传,所以用Puppeteer写了一个批量上传抖音视频的自动化程序用于推广. 环境和依赖:node,puppeteer 废话不多说,直接上代码: const puppeteer =r ...
- JavaScript_DOM详解
节点操作: 查看对象属性的值obj.getAttribute() 如: //获取图片 var imgs = document.getElementsByTagName("img") ...
- codeforces1213F Unstable String Sort 思维
题目传送门 题意:a和b都代表字符串的下标,至少用k个字符,构造一个长度为n的字符串,将这个字符串中的字符按无论是按$a$写还是按$b$写,字典序都非递减. 思路:如果将$a[l,r]=b[l,r]$ ...
- TCP协议中的三次握手和四次挥手(图解)(转)
转自:http://blog.csdn.net/whuslei/article/details/6667471 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看 ...
- PHP-全排列
给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]] ...
- hdu 5792 树状数组+离散化+思维
题目大意: Given a sequence A with length n,count how many quadruple (a,b,c,d) satisfies: a≠b≠c≠d,1≤a< ...
- Java高并发网络编程(五)Netty应用
推送系统 一.系统设计 二.拆包和粘包 粘包.拆包表现形式 现在假设客户端向服务端连续发送了两个数据包,用packet1和packet2来表示,那么服务端收到的数据可以分为三种,现列举如下: 第一种情 ...
- ApiCloud如何一键真机测试
首先假设你已经有了APICloud账号,并创建了App项目. 需要注意的是,手机和电脑需要连接在同一wifi环境下. 第一步 下载自定义Loader 进入“开发控制台” 点击我们的项目 选择模块,再选 ...
- JMeter Http请求之content-type用法
转载自https://www.cnblogs.com/imyalost/p/6726795.html 本文讲三种content-type以及在Jmeter中对应的参数输入方式 第一部分:目前工作中涉及 ...