Pagini recente » Cod sursa (job #2892577) | Cod sursa (job #2864164) | Cod sursa (job #2850587) | Cod sursa (job #317799) | Cod sursa (job #2126725)
#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
using namespace std;
const int nmax=105;
const long double eps=0.00000001;
long double a[nmax][nmax],mn[nmax][nmax];
int n[nmax][nmax];
int p[nmax],viz[nmax];
long double ans[nmax];
int N,m,i,j,k,x,y;
long double answer,rap,cap;
void solve()
{
for(i=0;i<=N+1;i++)
{
while(p[i]<=N+1&&fabs(a[i][p[i]])<eps)
p[i]++;
if(p[i]==N+1) {answer=0;return;}
if(p[i]==N+2) continue;
for(j=0;j<=N+1;j++)
if(i!=j&&fabs(a[j][p[i]])>eps)
{
rap=a[j][p[i]]/a[i][p[i]];
for(k=1;k<=N+1;k++)
a[j][k]-=a[i][k]*rap;
a[j][p[i]]=0;
}
}
for(i=0;i<=N+2;i++)
{
ans[p[i]]=a[i][N+1]/a[i][p[i]];
if(a[i][p[i]]==0) ans[p[i]]=0;
}
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
if(n[i][j]&&ans[i]<ans[j]&&viz[i])
answer=min(answer,mn[i][j]/(ans[j]-ans[i]));
}
void dfs(int x)
{
viz[x]=1;
for(int i=1;i<=N;i++)
if(n[x][i]&&(!viz[i]))
dfs(i);
}
int main()
{
ifstream f("flux.in");
ofstream g("flux.out");
f>>N>>m;answer=(1<<30);
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
mn[i][j]=100001;
for(i=1;i<=m;i++)
{
f>>x>>y>>cap;
n[x][y]++;n[y][x]++;
mn[x][y]=min(mn[x][y],cap);mn[y][x]=min(mn[y][x],cap);
}
dfs(1);
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
{
a[i][i]+=n[i][j];
a[i][j]-=n[i][j];
}
}
a[1][N+1]=-1;
a[N][N+1]=1;
a[0][1]=1;a[0][N+1]=0;
solve();if(!viz[N]) answer=0;
g<<fixed<<setprecision(6)<<answer;
return 0;
}