Pagini recente » Cod sursa (job #920620) | Cod sursa (job #917875) | Cod sursa (job #1700055)
#include <bits/stdc++.h>
#define maxN 257
#define e 0.0000000001
using namespace std;
int n, m, d[maxN][maxN];
double ans[maxN], a[maxN][maxN];
int V[maxN][maxN];
void read()
{
int i;
freopen("tunel.in", "r", stdin);
scanf("%d %d", &n, &m);
for (i = 1; i <= m; ++ i)
{
int A, B, C;
scanf("%d %d %d", &A, &B, &C);
d[A][B] += C;
d[B][A] += C;
V[A][++ V[A][0]] = B;
V[B][++ V[B][0]] = A;
}
}
void Swap(double &x, double &y)
{
double aux;
aux = x;
x = y;
y = aux;
}
void Gauss()
{
int i = 1, j = 1;
while (i <= n && j <= m)
{
int x, y;
for (x = i; x <= n; ++ x)
if (a[x][j] > e || a[x][j] < -e)
break;
if (x == n + 1)
{
++ j;
continue;
}
if (x != i)
for (y = 1; y <= m + 1; ++ y)
Swap(a[x][y], a[i][y]);
for (y = j + 1; y <= m + 1; ++ y)
a[i][y] = (double)(a[i][y] / a[i][j]);
a[i][j] = 1.00000000000;
for (y = i + 1; y <= n; ++ y)
{
int c;
for (c = j + 1; c <= m + 1; ++ c)
a[y][c] -= a[y][j] * a[i][c];
a[y][j] = 0.0000000000;
}
++ i;
++ j;
}
}
void Coef()
{
int i, j, x;
for (i = n; i >= 1; -- i)
for (j = 1; j <= m + 1; ++ j)
if (a[i][j] > e || a[i][j] < -e)
{
if (j == m + 1)
{
ans[0] = -1;
return ;
}
ans[j] = a[i][m + 1];
for (x = j + 1; x <= m; ++ x)
ans[j] -= a[i][x] * ans[x];
break;
}
}
void solve()
{
int i, j;
for (i = 1; i < n; ++ i)
{
for (j = 1; j <= V[i][0]; ++ j)
{
a[i][V[i][j]] = (double)(1.0000 / V[i][0]);
a[i][n + 1] -= (double)(1.0000 * d[i][V[i][j]] / V[i][0]);
}
a[i][i] = -1;
}
ans[n] = 0.000;
m = n;
-- n;
Gauss();
Coef();
}
void write()
{
freopen("tunel.out", "w", stdout);
printf("%.6lf", ans[1]);
}
int main()
{
read();
solve();
write();
return 0;
}