Pagini recente » Cod sursa (job #2847639) | Cod sursa (job #2856170) | Cod sursa (job #1054153) | Cod sursa (job #244170) | Cod sursa (job #2479825)
#include <fstream>
#include <iomanip>
#include <vector>
#include <algorithm>
#define DIMN 260
#define EPS 0.0000000001
using namespace std;
long double a[DIMN][DIMN] , dp[DIMN];
vector <pair <int,int> > v[DIMN];
int grad[DIMN];
int main()
{
ifstream fin ("tunel.in");
ofstream fout ("tunel.out");
int n,m,i,x,y,c,k,aux,j,nod,sum,vecin;
fin>>n>>m;
for (i=1;i<=m;i++){
fin>>x>>y>>c;
v[x].push_back(make_pair(y,c));
v[y].push_back(make_pair(x,c));
grad[x]++;
grad[y]++;
}
/// construiesc sistemul
a[1][1] = 1.0;
for (nod=2;nod<=n;nod++){
sum = 0;
a[nod][nod] = -1.0 * grad[nod];
for (i=0;i<v[nod].size();i++){
vecin = v[nod][i].first;
sum-=v[nod][i].second;
a[nod][vecin] += 1.0;
}
a[nod][n+1] = 1.0 * sum;
}
/// solve gauss
i=j=1;
while (i<=n && j<=n){
for (k=i;k<=n;k++){
if (a[k][j]!=0)
break;
}
if (k>n){ /// variabila libera
j++;
}
else {
/// interschimb linia i cu k
for (aux = 1; aux <= n+1; aux++)
swap(a[i][aux] , a[k][aux]);
for (aux = j+1 ; aux <= n+1 ; aux++){
a[i][aux] /= a[i][j];
}
a[i][j] = 1.0;
for (k=i+1;k<=n;k++){
for (aux=n+1;aux>=j;aux--){
a[k][aux] = a[k][aux] - a[k][j] * a[i][aux];
}
}
i++;
j++;
}
}
/// ai facut sistemul sa devina un triunghi intors
for (i=n;i;i--){
for (j=1;j<=n+1;j++){
if (-EPS > a[i][j] || a[i][j] > EPS) /// daca era intre -EPS , EPS , era 0
break;
}
if (j == n + 2)
continue; /// dp[i] = variabila libera , sa zicem 0
dp[j] = a[i][n+1] / a[i][j];
for (aux=i-1;aux;aux--)
a[aux][n+1] -= dp[j] * a[aux][j];
}
fout << setprecision(5) << fixed << dp[n];
return 0;
}