Pagini recente » Borderou de evaluare (job #3365550) | Statistici Cearnau Dan-Cristian (CromozoneX) | Cod sursa (job #3365896) | Cod sursa (job #3365897) | Cod sursa (job #3364808)
#include <fstream>
#include <iomanip>
#include <vector>
#include <cassert>
#define fr first
#define sc second
using namespace std;
ifstream in("flux.in");
ofstream out("flux.out");
const int NMAX=1e2+5;
const double EPS=1e-7, INF=1e10;
int n, m;
vector<pair<int, double>> adj[NMAX];
vector<vector<double>> a;
vector<double> b, sol, maxi[2];
vector<int> poz;
void gauss()
{
sol.assign(n, 0);
poz.assign(n, -1);
int i=0, j=0;
for(;i<n && j<n;j++)
{
int maxi=i;
for(int ii=i;ii<n;ii++)
if(a[ii][j]>a[maxi][j])
maxi=ii;
if(abs(a[maxi][j])<EPS)
continue;
swap(a[i], a[maxi]);
swap(b[i], b[maxi]);
poz[j]=i;
for(int ii=0;ii<n;ii++)
if(ii!=i)
{
double q=a[ii][j]/a[i][j];
for(int jj=0;jj<n;jj++)
a[ii][jj]-=q*a[i][jj];
b[ii]-=q*b[i];
}
i++;
}
for(j=0;j<n;j++)
if(poz[j]!=-1)
sol[j]=b[poz[j]]/a[poz[j]][j];
}
int main()
{
in>>n>>m;
while(m--)
{
int a, b, c; in>>a>>b>>c;
a--; b--;
adj[a].push_back({b, c});
adj[b].push_back({a, c});
}
a.resize(n); b.assign(n, 0);
for(int i=1;i<=n-2;i++)
{
a[i].assign(n, 0);
//cat intra in i = cat iese din i
a[i][i]=adj[i].size();
for(auto ej:adj[i])
a[i][ej.fr]-=1;
}
//f[0]=1
a[0].assign(n, 0); a[0][0]=b[0]=1;
a[n-1].assign(n, 0);
//cat iese din 0 = cat intra in n
a[n-1][0]=adj[0].size(); a[n-1][n-1]=adj[n-1].size();
for(auto ej:adj[0])
a[n-1][ej.fr]+=1;
for(auto ej:adj[n-1])
a[n-1][ej.fr]+=1;
gauss();
double maxk=INF;
for(int i=0;i<n;i++)
if(poz[i]!=-1)
for(auto ej:adj[i])
if(poz[ej.fr]!=-1 && sol[i]>sol[ej.fr])
maxk=min(maxk, ej.sc/(sol[i]-sol[ej.fr]));
maxi[0].assign(n, INF); maxi[1].assign(n, INF);
for(int i=0;i<n;i++)
if(poz[i]==-1)
for(auto ej:adj[i])
{
maxi[0][i]=min(maxi[0][i], maxk*sol[ej.fr]+ej.sc);
maxi[1][i]=min(maxi[1][i], -maxk*sol[ej.fr]+ej.sc);
}
double fp=0, fn=0;
for(auto ej:adj[0])
if(poz[ej.fr]!=-1)
{
fp+=maxk*(sol[ej.fr]-sol[0]);
fn-=maxk*(sol[ej.fr]-sol[0]);
}
else
{
fp+=(maxi[0][ej.fr]-maxk*sol[0]);
fn+=(maxi[1][ej.fr]+maxk*sol[0]);
}
out<<fixed<<setprecision(10)<<max(fp, fn);
return 0;
}