Pagini recente » Cod sursa (job #879751) | Cod sursa (job #3170933) | Cod sursa (job #1729097) | Cod sursa (job #1351464) | Cod sursa (job #751369)
Cod sursa(job #751369)
#include <cstdio>
#include <vector>
using namespace std;
#define maxn 110
#define maxm 5010
#define eps 0.00001
int n, m, x, y;
double g[maxn][maxn], sol[maxn], rez;
int a[maxm], b[maxm], c[maxm], f[maxm];
vector<int> v[maxn];
void df(int nod)
{
f[nod]=1;
for(int i=0; i<v[nod].size(); ++i)
if(f[v[nod][i]]==0)
df(v[nod][i]);
}
int main()
{
freopen("flux.in", "r", stdin);
freopen("flux.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i=1; i<=m; ++i)
{
scanf("%d%d%d", &a[i], &b[i], &c[i]);
v[a[i]].push_back(b[i]);
v[b[i]].push_back(a[i]);
}
df(1);
if(f[n]==0)
{
printf("0.000000\n");
return 0;
}
for(int i=1; i<=m; ++i)
{
if(a[i]!=1)
{
g[a[i]][a[i]]+=1;
g[a[i]][b[i]]-=1;
}
if(b[i]!=1)
{
g[b[i]][b[i]]+=1;
g[b[i]][a[i]]-=1;
}
}
g[1][1]=1;
g[n][n+1]=1;
int i=1, j=1;
while(i<=n && j<=n)
{
int k;
double aux;
for(k=i; k<=n; ++k)
if(g[k][j]>eps || g[k][j]<-eps)
break;
if(k==n+1)
{
++j;
continue;
}
if(k!=i)
for(int l=1; l<=n+1; ++l)
{
aux=g[i][l];
g[i][l]=g[k][l];
g[k][l]=aux;
}
for(int l=j+1; l<=n+1; ++l)
g[i][l]=g[i][l]/g[i][j];
g[i][j] = 1;
for(int u=i+1; u<=n; ++u)
{
if(u==i)
continue;
for(int l=j+1; l<=n+1; ++l)
g[u][l]-=g[u][j]*g[i][l];
g[u][j] = 0;
}
++i; ++j;
}
for(int i=n; i; --i)
{
if(g[i][i]>eps || g[i][i]<-eps)
{
sol[i]=g[i][n+1];
for(int j=i+1; j<=n; ++j)
sol[i]-=g[i][j]*sol[j];
}
}
for(int i=1; i<=m; ++i)
{
if(sol[a[i]]<sol[b[i]])
swap(a[i], b[i]);
if(i==1)
rez=c[i]/(sol[a[i]]-sol[b[i]]);
else
rez=min(rez, c[i]/(sol[a[i]]-sol[b[i]]));
}
printf("%.6lf\n", rez);
return 0;
}