Pagini recente » Cod sursa (job #2948616) | Cod sursa (job #1739303) | Cod sursa (job #3238755) | Cod sursa (job #547439) | Cod sursa (job #2530426)
#include <cstdio>
#include <vector>
using namespace std;
const double eps = 1.e-7;
int grad[260];
struct Noduri
{
int y,cost;
};
vector<Noduri> g[260];
double mat[260][260];
double sol[260];
int nredge[260][260];
int main()
{ freopen("tunel.in", "r", stdin);
freopen("tunel.out", "w", stdout);
int n,m,i,x,y,z,j,k,l;
scanf("%d%d", &n, &m);
for(i=1; i<=m; i++){
scanf("%d%d%d", &x, &y, &z);
g[x].push_back({y,z});
g[y].push_back({x,z});
grad[x]++;
grad[y]++;
nredge[x][y]++;
nredge[y][x]++;
}
for(i=1; i<=n; i++){
if(i!=n)
mat[i][i]=1;
for(j=0; j<g[i].size(); j++){
if(g[i][j].y!=n)
mat[i][g[i][j].y]=(-1.0*nredge[i][g[i][j].y])/(1.0*grad[i]);
mat[i][n+1]+=(1.0*g[i][j].cost)/(1.0*grad[i]);
}
}
for(i=1,j=1; i<=n && j<=n; i++,j++){
for(k=i; k<=n; k++){
if(mat[k][j]<=-eps || mat[k][j]>=eps){
for(l=1; l<=n+1; l++)
swap(mat[k][l], mat[i][l]);
break;
}
}
if(mat[i][j]>=-eps && mat[i][j]<=eps){
i--;
continue;
}
for(k=j+1; k<=n+1; k++)
mat[i][k]/=mat[i][j];
mat[i][j]=1.0;
for(k=i+1; k<=n; k++){
for(l=j+1; l<=n+1; l++)
mat[k][l]-=mat[k][j]*mat[i][l];
mat[k][j]=0.0;
}
}
for(i=n; i>=0; i--)
for(j=1; j<=n; j++){
if(mat[i][j]<=-eps || mat[i][j]>=eps){
sol[j]=mat[i][n+1];
for(l=j+1; l<=n; l++)
sol[j]-=mat[i][l]*sol[l];
sol[j]/=mat[i][j];
break;
}
}
printf("%.4lf", sol[1]);
return 0;
}