BZOJ3143 [Hnoi2013]游走 【高斯消元】
题目
一个无向连通图,顶点从1编号到N,边从1编号到M。
小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数。当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和。
现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小。
输入格式
第一行是正整数N和M,分别表示该图的顶点数 和边数,接下来M行每行是整数u,v(1≤u,v≤N),表示顶点u与顶点v之间存在一条边。 输入保证30%的数据满足N≤10,100%的数据满足2≤N≤500且是一个无向简单连通图。
输出格式
仅包含一个实数,表示最小的期望值,保留3位小数。
输入样例
3 3
2 3
1 2
1 3
输出样例
3.333
解释
边(1,2)编号为1,边(1,3)编号2,边(2,3)编号为3。
题解
我们算出每个边的期望经过次数wi,按大到小分别赋1到M就是最优解
wi=xudegree[u]+xvdegree[v]
xi指每个点的经过次数
我们只要算出xi就可以了
对于每个点i,我们可以列出一个方程:
xi=∑j−>ijxjdegree[j]
N个方程,N个未知数,高斯消元可求解
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define eps 1e-9
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u]; k != -1; k = ed[k].nxt)
using namespace std;
const int maxn = 505,maxm = 500005,INF = 1000000000;
inline int RD(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}
return out * flag;
}
int G[maxn][maxn],N,M,de[maxn];
double A[maxn][maxn],X[maxn];
struct EDGE{int a,b; double w;}e[maxm];
inline bool operator <(const EDGE& a,const EDGE& b){return a.w > b.w;}
void gauss(){
for (int i = 1; i <= N; i++){
double t = A[i][i];
if (fabs(t) < eps) continue;
for (int j = i; j <= N + 1; j++) A[i][j] /= t;
for (int j = i + 1; j <= N; j++){
t = A[j][i];
for (int k = i; k <= N + 1; k++)
A[j][k] -= A[i][k] * t;
}
}
for (int i = N; i > 0; i--){
for (int j = i + 1; j <= N; j++)
A[i][N + 1] -= X[j] * A[i][j];
X[i] = A[i][N + 1] / A[i][i];
}
}
int main(){
N = RD(); M = RD();
REP(i,M){
de[e[i].a = RD()]++; de[e[i].b = RD()]++;
G[e[i].a][e[i].b] = G[e[i].b][e[i].a] = true;
}
for (int i = 1; i < N; i++) A[i][i] = -1;
REP(i,M){
A[e[i].a][e[i].b] += 1.0 / de[e[i].b];
A[e[i].b][e[i].a] += 1.0 / de[e[i].a];
}
for (int i = 1; i <= N; i++) A[i][N + 1] = 0;
A[1][N + 1] = -1; A[N][N + 1] = 1; A[N][N] = 1;
gauss();
REP(i,M) e[i].w = X[e[i].a] / de[e[i].a] + X[e[i].b] / de[e[i].b];
sort(e + 1,e + 1 + M);
double ans = 0;
REP(i,M) ans += e[i].w * i;
printf("%.3lf",ans);
return 0;
}
BZOJ3143 [Hnoi2013]游走 【高斯消元】的更多相关文章
- BZOJ3143:[HNOI2013]游走(高斯消元)
Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...
- 【BZOJ-3143】游走 高斯消元 + 概率期望
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2264 Solved: 987[Submit][Status] ...
- bzoj 3143: [Hnoi2013]游走 高斯消元
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1026 Solved: 448[Submit][Status] ...
- BZOJ 3143 HNOI2013 游走 高斯消元 期望
这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...
- Luogu3232 HNOI2013 游走 高斯消元、期望、贪心
传送门 这种无向图上从一个点乱走到另一个点的期望题目好几道与高斯消元有关 首先一个显然的贪心:期望经过次数越多,分配到的权值就要越小. 设$du_i$表示$i$的度,$f_i$表示点$i$的期望经过次 ...
- [HNOI2013][BZOJ3143] 游走 - 高斯消元
题目描述 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边 ...
- 【BZOJ3143】【HNOI2013】游走 高斯消元
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3143 我们令$P_i$表示从第i号点出发的期望次数.则$P_n$显然为$0$. 对于$P ...
- 【xsy1201】 随机游走 高斯消元
题目大意:你有一个$n*m$的网格(有边界),你从$(1,1)$开始随机游走,求走到$(n,m)$的期望步数. 数据范围:$n≤10$,$m≤1000$. 我们令 $f[i][j]$表示从$(1,1) ...
- [BZOJ3143][HNOI2013]游走(期望+高斯消元)
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3576 Solved: 1608[Submit][Status ...
随机推荐
- 继续分享shell 之变量使用
变量类型 运行shell时,会同时存在三种变量: 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量. 2) 环境变量 所有的程序,包括 ...
- 「译」setState如何知道它该做什么?
本文翻译自:How Does setState Know What to Do? 原作者:Dan Abramov 如果有任何版权问题,请联系shuirong1997@icloud.com 当你在组件中 ...
- 获取点击li的当前索引
获取点击li的当前索引 点击特定次序的li 展现特定的页面 $('.wgsb').find('.wangge_data_list li').click(function(){ var index=$ ...
- Facebook Reporting API -- Facebook 数据导出API
1.获取token 浏览器打开 "访问口令工具" (FB链接请FQ) https://developers.facebook.com/tools/accesstoken/ App ...
- McNay Art Museum【McNay艺术博物馆】
McNay Art Museum When I was 17, I read a magazine artice about a museum called the McNay, once the h ...
- Pandas 数据读取
1.读取table # 读取普通分隔数据:read_table # 可以读取txt,csv import os os.chdir('F:/') #首先设置一下读取的路径 data1 = pd.read ...
- Android Kotlin 连接 http
由于近期网上搜索了很多Android连接到http的方法, 可是2013年以前的方法现在都不能用了,要么报错,要么被遗弃,岁月留下来的东西只能自己整理了. 其实很简单,就一个HttpUtil通用类.可 ...
- 获取<考试>博文密码!o(*≧▽≦)ツ
就是CJ高二组通用的密码 如果你想知道,请联系QQ,3057244225,或者直接面对面问博主(...) 是我们的内部材料,原创题目是不能外传的.请谅解. 当然如果是原题的话我们是不会上锁的啦
- 关于main与wmain函数
最近写一个控制台程序,并且希望该控制台程序运行时不显示控制台窗口,于是在程序include语句下面加入如下代码 #pragma comment (linker,"/subsystem:\&q ...
- CSS系列(8) CSS后代选择器和子选择器详解
一.CSS后代选择器详解 1, 生动介绍基本概念 一个标签嵌B在另一个标签A内部,B就是A的后代. 而且,B的后代也是A的后代,这就叫“子子孙孙无穷尽也”. 比如: <div> < ...