【题目链接】
【思路要点】
- 补档博客,无题解。
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 505 #define MAXM 250005 #define EPS 1e-7 int n, m, d[MAXN], u[MAXM], v[MAXM]; double a[MAXN][MAXN], x[MAXN], cnt[MAXM]; int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) { scanf("%d%d", &u[i], &v[i]); d[u[i]]++; d[v[i]]++; } for (int i = 1; i < n; i++) { a[i][i] -= 1; for (int j = 1; j <= m; j++) { if (u[j] == i && v[j] != n) a[i][v[j]] += 1.0 / d[v[j]]; if (v[j] == i && u[j] != n) a[i][u[j]] += 1.0 / d[u[j]]; } } a[n][n] = 1; a[n][n + 1] = 1; a[1][n + 1] = -1; for (int i = 1; i <= n; i++) { if (fabs(a[i][i]) <= EPS) { for (int j = i + 1; j <= n; j++) if (fabs(a[j][i]) >= EPS) { swap(a[i], a[j]); break; } } for (int j = 1; j <= n; j++) { if (i == j) continue; double tmp = a[j][i] / a[i][i]; for (int k = 1; k <= n + 1; k++) a[j][k] -= a[i][k] * tmp; } } for (int i = 1; i <= n; i++) x[i] = a[i][n + 1] / a[i][i]; for (int i = 1; i <= m; i++) { if (u[i] != n) cnt[i] += x[u[i]] / d[u[i]]; if (v[i] != n) cnt[i] += x[v[i]] / d[v[i]]; } sort(cnt + 1, cnt + m + 1); double ans = 0; for (int i = 1; i <= m; i++) ans += cnt[i] * (m - i + 1); printf("%.3lf\n", ans); return 0; }