Pagini recente » Cod sursa (job #48300) | Cod sursa (job #53521) | Cod sursa (job #2244281) | Cod sursa (job #2644704) | Cod sursa (job #2735319)
#include <bits/stdc++.h>
#define EPS 0.00001
using namespace std;
ifstream fin("tunel.in");
ofstream fout("tunel.out");
int N, M;
double a[300][300], vals[305];
int S[305], grad[305];
vector <int> v[300];
int main()
{
fin >> N >> M;
for(int i = 1; i <= M; i++)
{
int x, y, z;
fin >> x >> y >> z;
grad[x]++;
grad[y]++;
S[x] += z;
S[y] += z;
v[x].push_back(y);
v[y].push_back(x);
}
///val[i] expected value de a ajunge de la i la N
for(int i = 1; i <= N - 1; i++)///val[N] = 0
{
for(int j = 0; j < v[i].size(); j++)
a[i][v[i][j]] ++;
a[i][i] = -grad[i];
a[i][N + 1] = -S[i];
}
///rezolvam sistemul
int l = 1, c = 1;
while(l < N && c < N)
{
int li;
for(int i = l; i < N; i++)
if(a[i][c] > EPS || a[i][c] < -EPS)
{
li = i;
break;
}
if(li == N)///e variabila libera
{
c++;
continue;
}
double aux;
for(int i = 1; i <= N + 1; i++)///interschimbm eucatiile
{
aux = a[li][i];
a[li][i] = a[l][i];
a[l][i] = aux;
}
for(int i = 1; i <= N + 1; i++)///obtinem coef 1 pe necunoscuta cautata
if(i != c)
a[l][i] /= a[l][c];
a[l][c] = 1;
for(int i = l + 1; i < N; i++)///scadem ecuatiile
{
for(int j = 1; j <= N + 1; j++)
if(j != c)
a[i][j] -= a[l][j] * a[i][c];
a[i][c] = 0;
}
l++;
c++;
}
///scoatem valoriile
vals[N] = 0;
for(int i = N - 1; i >= 1; i--)
{
for(int j = 1; j < N; j++)
if(a[i][j] > EPS || a[i][j] < -EPS)
{
vals[j] = a[i][N + 1];
for(int it = j + 1; it <= N; it++)
vals[j] -= vals[it] * a[i][it];
break;
}
}
fout << fixed << setprecision(5) << vals[1] << '\n';
return 0;
}