Pagini recente » Cod sursa (job #299869) | Cod sursa (job #2963554) | Cod sursa (job #1898187) | Cod sursa (job #667463) | Cod sursa (job #2480496)
#include <fstream>
#include <vector>
#include <iomanip>
#define DIM 300
#define EPS 0.0001
using namespace std;
ifstream fin ("tunel.in");
ofstream fout ("tunel.out");
vector <int> L[DIM];
int dist[DIM][DIM],sum_dist[DIM],grad[DIM];
int n,m,i,j,x,y,c;
double a[DIM][DIM],sol[DIM];
inline int f (double n){
if (n < -EPS || n > EPS)
return 0;
return 1;
}
int main (){
fin>>n>>m;
for (i=1;i<=m;i++){
fin>>x>>y>>c;
dist[x][y] = dist[y][x] = c;
sum_dist[x] += c, sum_dist[y] += c;
L[x].push_back(y);
L[y].push_back(x);
grad[x]++, grad[y]++;
}
/// x[i] - expected time sa ajung din i in n
/// coeficientii
for (i=1;i<n;i++){
/// nodurile care nu sunt vecine cu i au coef 0
for (auto vecin : L[i])
a[i][vecin] += 1.0;
a[i][i] = -1.0*grad[i];
a[i][n+1] = -1.0*sum_dist[i]; /// termenul liber e suma dist
}
//a[n][n] = 1.0;
int i = 1, j = 1;
while (i <= n && j <= n){
int lin = i;
while (lin <= n && a[lin][j] == 0)
lin++;
if (lin == n+1){
j++;
continue;
}
if (lin != i){
for (int col=1;col<=n+1;col++)
swap (a[lin][col],a[i][col]);
}
for (int k=j+1;k<=n+1;k++)
a[i][k] /= a[i][j];
a[i][j] = 1;
for (int k=i+1;k<=n;k++){
for (int t=j+1;t<=n+1;t++)
a[k][t] = a[k][t] - a[i][t]*a[k][j];
a[k][j] = 0;
}
i++, j++;
}
for (i=n;i>=1;i--){
j = 1;
while (j <= n+1 && f(a[i][j]))
j++;
if (j == n+2)
continue;
sol[j] = a[i][n+1];
for (int k=j+1;k<=n+1;k++)
sol[j] -= a[i][k]*sol[k];
}
fout<<setprecision(5)<<fixed<<sol[1]<<"\n";
return 0;
}