Pagini recente » Cod sursa (job #999451) | Cod sursa (job #2614790)
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int INF = 1000000000;
int cost[105][105];
int drum[105][105];
const double eps = 1e-5;
double mat[105][105];
double sol[105];
bool viz[105];
int n;
void dfs(int nod)
{
viz[nod]=1;
for(int i=1; i<=n; i++)
if(viz[i]==0 && drum[nod][i])
dfs(i);
}
int main()
{ freopen("flux.in", "r", stdin);
freopen("flux.out", "w", stdout);
int m,i,j,x,y,z,k,l;
scanf("%d%d", &n, &m);
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
cost[i][j]=INF;
for(i=1; i<=m; i++){
scanf("%d%d%d", &x, &y, &z);
cost[x][y]=min(cost[x][y], z);
cost[y][x]=cost[x][y];
drum[x][y]++;
drum[y][x]++;
}
dfs(1);
if(viz[n]==0){
printf("0.00000");
return 0;
}
for(i=2; i<=n; i++)
for(j=1; j<=n; j++)
if(i!=j){
mat[i][j]=drum[i][j];
mat[i][i]-=drum[i][j];
}
mat[n][n+1]=-1;
for(i=2,j=2; 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;
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;
}
}
for(i=n; i>=2; i--)
for(j=2; j<=n+1; 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];
break;
}
}
double res=INF;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
if(i!=j && drum[i][j])
if(fabs(sol[i]-sol[j])>eps)
res=min(res, 1.0*cost[i][j]/fabs(sol[i]-sol[j]));
printf("%.3lf", res);
return 0;
}