Pagini recente » Cod sursa (job #1918163) | Cod sursa (job #444106) | Cod sursa (job #1302456) | Cod sursa (job #368199) | Cod sursa (job #1265704)
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;
const int Nmax = 256;
const double Eps = 1e-12;
vector<int> G[Nmax];
int main()
{
freopen("tunel.in", "r", stdin);
freopen("tunel.out", "w", stdout);
int N, M;
scanf("%d%d", &N, &M);
vector<vector<double>> A(N, vector<double>(N + 1, 0));
vector<double> X(N);
while (M--) {
int x, y, c;
scanf("%d%d%d", &x, &y, &c);
G[x - 1].push_back(y - 1);
G[y - 1].push_back(x - 1);
A[x - 1][N] -= c;
A[y - 1][N] -= c;
}
for (int i = 0; i < N; ++i) {
A[i][i] = -1;
A[i][N] /= G[i].size();
for (int p: G[i])
A[i][p] += 1.0D / G[i].size();
}
for (int i = 0, j = 0; i < N && j < N; ) {
int k;
for (k = i; k < N && abs(A[k][j]) < Eps; ++k);
if (k == N) {
++j;
continue;
}
if (k != i) A[i].swap(A[k]);
for (int k = j + 1; k <= N; ++k)
A[i][k] /= A[i][j];
A[i][j] = 1;
for (int k = i + 1; k < N; ++k) {
for (int p = j + 1; p <= N; ++p)
A[k][p] -= A[i][p] * A[k][j];
A[k][j] = 0;
}
i++;
j++;
}
for (int i = N - 1; i >= 0; --i) {
for (int j = 0; j <= N; ++j) {
if (abs(A[i][j]) > Eps) {
X[j] = A[i][N];
for (int k = j + 1; k < N; ++k)
X[j] -= A[i][k] * X[k];
break;
}
}
}
printf("%.12f\n", X[0]);
}