记录编号 577939 评测结果 AAAAAAAAAA
题目名称 [HNOI 2013]游走 最终得分 100
用户昵称 Gravataryrtiop 是否通过 通过
代码语言 C++ 运行时间 0.250 s
提交时间 2022-12-08 22:21:29 内存使用 5.19 MiB
显示代码纯文本
// Problem: #2383. 「HNOI2013」游走
// Contest: LibreOJ
// URL: https://loj.ac/p/2383
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
using pii = std::pair<int,int>;
using i64 = long long;

const int maxn = 505;
int n,m,deg[maxn];
std::vector<pii> G[maxn];
double a[maxn][maxn],f[maxn],g[maxn * maxn];

int main() {
	freopen("walk.in","r",stdin);
	freopen("walk.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(int i = 1;i <= m;++ i) {
		int u,v;
		scanf("%d %d",&u,&v);
		G[u].pb(v , i);
		G[v].pb(u , i);
		++ deg[u];
		++ deg[v];
	}
	for(int i = 1;i < n;++ i) {
		a[i][i] = 1.0;
		for(auto& [v , id] : G[i]) {
			if(v == n)continue ;
			a[i][v] = -1.0 / (double)deg[v];
		}
	}
	a[1][n] = 1.0;
	for(int i = 1;i < n;++ i) {
		int m = i;
		for(int j = i + 1;j < n;++ j)
			if(std::fabs(a[j][i]) > std::fabs(a[m][i]))
				m = j;
		std::swap(a[i] , a[m]);
		for(int j = 1;j < n;++ j) {
			if(j == i)continue ;
			double d = a[j][i] / a[i][i];
			for(int k = i + 1;k <= n;++ k)
				a[j][k] -= a[i][k] * d;
		}
	}
	for(int i = 1;i < n;++ i)
		f[i] = a[i][n] / a[i][i];
	for(int i = 1;i < n;++ i) {
		for(auto& [v , id] : G[i]) {
			if(v < i)continue ;
			g[id] = f[i] / (1.0 * deg[i]) + f[v] / (1.0 * deg[v]);
		}
	}
	std::sort(g + 1 , g + 1 + m , std::greater<double>());
	double ans = 0;
	for(int i = 1;i <= m;++ i)
		ans += 1.0 * i * g[i];
	printf("%.3lf\n",ans);
	return 0;
}