Pagini recente » Cod sursa (job #1095378) | Cod sursa (job #479689) | Borderou de evaluare (job #1967568) | Borderou de evaluare (job #3136409) | Cod sursa (job #1161701)
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
const int NMAX = 260;
const double EPS = 1e-4;
int N, M, X, Y, C, Deg[NMAX];
double A[NMAX][NMAX];
void DoGauss()
{
int Ec = 1, Nec = 1;
while(Ec < N && Nec <= N)
{
int i;
for(i = Ec; i <= N; ++ i)
if(fabs(A[i][Nec]) > EPS)
break;
if(i == N + 1)
{
Nec ++;
continue;
}
for(int k = 1; k <= N + 1; ++ k)
swap(A[i][k], A[Ec][k]);
for(int i = 1; i <= N; ++ i)
if(i != Ec)
{
double R = A[i][Nec] / A[Ec][Nec];
for(int j = Nec; j <= N + 1; ++ j)
A[i][j] -= A[Ec][j] * R;
}
Ec ++;
Nec ++;
}
printf("%.3lf\n", A[1][N + 1] / A[1][1]);
}
int main()
{
freopen("tunel.in", "r", stdin);
freopen("tunel.out", "w", stdout);
scanf("%i %i", &N, &M);
for(int i = 1; i <= M; ++ i)
{
scanf("%i %i %i", &X, &Y, &C);
Deg[X] ++;
Deg[Y] ++;
A[X][Y] ++;
A[Y][X] ++;
A[X][N + 1] -= C;
A[Y][N + 1] -= C;
}
for(int i = 1; i < N; ++ i)
{
for(int j = 1; j <= N + 1; ++ j)
A[i][j] /= Deg[i];
A[i][i] = -1;
}
for(int i = 1; i <= N + 1; ++ i)
A[N][i] = A[i][N] = 0;
DoGauss();
}