Pagini recente » Cod sursa (job #508481) | Cod sursa (job #2227722) | Cod sursa (job #2443319) | Cod sursa (job #1779063) | Cod sursa (job #2286061)
#include <stdio.h>
#include <fstream>
#include <cmath>
#include <iomanip>
using namespace std;
ifstream f("flux.in");
ofstream g("flux.out");
const double eps=1E-8;
const double INF=1E+9;
const int DIM=101;
double C[DIM][DIM],m[DIM][DIM+1],F[DIM][DIM],X[DIM];
bool Viz[DIM],D[DIM][DIM];
int N,M;
double sol;
void gauss()
{
int i=2,j=2,k,l;
while(i<=N && j<=N)
{
for( k=i; k<=N; k++)
if(abs(m[i][j])>=eps)
{
break;
}
if(k==N+1)
{
j++;
continue;
}
if(k!=i)
for(l=j; l<=N+1; i++)
swap(m[i][l], m[k][l]);
for(k=j+1; k<=N+1; k++)
m[i][k]/=m[i][j];
m[i][j]=1;
for (k=i+1; k<=N; k++)
{
for(l=j+1; l<=N+1; l++)
m[k][l]-=m[i][l]*m[k][j];
m[k][j]=0;
}
i++;
j++;
}
}
void solutie()
{
for(int i=N; i>=2; i--)
for(int j=i; j<=N; j++)
if(abs(m[i][j]>eps))
{
X[j]=m[i][N+1];
for(int t=j+1; t<=N; t++)
X[j]-=m[i][t]*X[t];
break;
}
}
void DFS(int nod)
{
Viz[nod]=1;
for(int i=1; i<=N; i++)
if(D[nod][i])
{
F[nod][i]=X[i]-X[nod];
if(!Viz[i])
DFS(i);
}
}
int main()
{
int x,y,z;
f>>N>>M;
for(int i=1; i<=N; i++)
for(int j=1; j<=N; j++)
C[i][j]=INF;
for(int i=1; i<=M; i++)
{
f>>x>>y>>z;
if(z<C[x][y]) C[x][y]=C[y][x]=z;
D[x][y]=D[y][x]=1;
m[x][x]++;
m[y][y]++;
m[x][y]--;
m[y][x]--;
}
m[N][N+1]=1;
gauss();
solutie();
DFS(1);
if(Viz[N])
{
sol=INF;
for(int i=1; i<=N; i++)
for(int j=1; j<=N; j++)
if(D[i][j] && F[i][j]>0)
sol=min(sol,C[i][j]/F[i][j]);
}
g<<setprecision(3)<<fixed<<sol;
return 0;
}