Pagini recente » Cod sursa (job #3147040) | Cod sursa (job #619946) | Cod sursa (job #2602807) | Cod sursa (job #2846263) | Cod sursa (job #1045210)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("flux.in");
ofstream g("flux.out");
#define db double
#define LE 166
#define inf (1<<30)
#include <iomanip>
db ec[LE][LE];
bool viz[LE][LE];
int i,j,n,m,xx;
int yy,cc,p;
int vaca[LE][LE];
db val[LE];
db result=0;
pair<int,int> ed[LE*LE];
#define mp make_pair
#define x first
#define y second
db ced[LE*LE];
int nred;
void _gauss(int nrec)
{
int i,j,lin=0;
while (true)
{
int minx=inf,ind;
for(i=lin+1; i<=nrec; ++i)
for(j=1; j<=n; ++j)
if (ec[i][j]&&j<minx)
{
minx=j;
ind=i;
}
if (minx==inf) break;
++lin;
for(i=1; i<=n; ++i) swap(ec[lin][i],ec[ind][i]);
for(i=lin+1; i<=nrec; ++i)
{
db coef=ec[i][minx]/ec[lin][minx];
for(j=1; j<=n+1; ++j) ec[i][j]-=(ec[lin][j]*coef);
}
}
for(i=lin; i>0; --i)
{
for(p=1; p<=n; ++p) if (ec[i][p]) break;
val[p]=ec[i][n+1]/ec[i][p];
for(j=1; j<i; ++j) ec[j][n+1]-=(val[p]*ec[j][p]);
}
}
int main()
{
f>>n>>m;
double vmin=1;
for(i=1;i<=30;++i)
vmin=vmin*(db)i;
for(i=1; i<=m; ++i)
{
f>>xx>>yy>>cc;
viz[xx][yy]=viz[yy][xx]=true;
vaca[xx][yy]++;
vaca[yy][xx]++;
ed[++nred]=mp(xx,yy);
ced[nred]=cc;
if (xx>yy)swap(xx,yy);
if (xx==1&&yy!=n) ec[yy-1][yy]++;
}
//for(i=1;i<=n;++i)
// for(j=1;j<=n;++j)
// if (viz[i][j]==false&&vaca[i][j]!=0)
// int okz=1;
for(i=2; i<n; ++i)
for(j=2; j<=n; ++j)
// if (viz[i][j])
{
// if (viz[i][j]==false&&vaca[i][j])
// int okz=true;
ec[i-1][j]-=vaca[i][j];
ec[i-1][i]+=vaca[i][j];
}
val[2]=1;
//for(i=1; i<=n-2; ++i,cout<<'\n')
// for(j=1; j<=n+1; ++j) cout<<ec[i][j]<<" ";
//cout<<'\n'<<'\n';
for(i=1; i<=n-2; ++i)
{
ec[i][n+1]-=(ec[i][2]);
ec[i][2]=0;
}
_gauss(n-2);
g<<fixed;
g<<setprecision(3);
//for(i=1; i<=n; ++i) cout<<val[i]<<" ";
// cout<<'\n'<<'\n';
for(int t=1; t<=nred; ++t)
{
i=ed[t].x;
j=ed[t].y;
if (val[i]>val[j]) swap(i,j);
if (val[j]-val[i]>=0.0000000001)
vmin=min(vmin,ced[t]/(val[j]-val[i]));
}
for(int t=1; t<=nred; ++t)
{
i=ed[t].x;
j=ed[t].y;
if (val[i]>val[j]) swap(i,j);
if (j!=n) continue;
result+=(val[j]-val[i])*vmin;
}
g<<result<<'\n';
f.close();
g.close();
return 0;
}