Pagini recente » Cod sursa (job #20536) | Cod sursa (job #471197) | Cod sursa (job #2048652) | Cod sursa (job #2793383) | Cod sursa (job #423069)
Cod sursa(job #423069)
#include<iostream>
#include<string>
#include<vector>
using namespace std;
#define NM 105
#define MM 5005
#define dl long double
dl A[NM][NM],X[NM];
int ad[NM][NM];
int MO[MM][3],N,M;
inline dl ab(dl nr)
{
if(nr>=0) return nr;
return -nr;
}
inline void swap_rows(int r1,int r2)
{
for(int i=1;i<=N+1;++i)
{
dl aux=A[r1][i];
A[r1][i]=A[r2][i];
A[r2][i]=aux;
}
}
inline void scade(int r1,int r2,dl coef)
{
for(int i=r2;i<=N+1;++i)
A[r1][i]-=(coef*A[r2][i]);
}
inline void gauss()
{
//sawa sawa
for(int i=1;i<N;++i)
{
//coloana vizata e i(intotdeauna)
int best=i;
for(int j=i+1;j<=N;++j)
if(ab(A[j][i])>ab(A[best][i])) best=j;
if(i!=best) swap_rows(i,best);
for(int j=i+1;j<=N;++j)
if(A[j][i]!=0)
{
dl cat=(dl)A[j][i]/(dl)A[i][i];
scade(j,i,cat);
}
}
//hakuna matata
for(int i=N;i>=1;--i)
{
dl tot=A[i][N+1];
for(int j=i+1;j<=N;++j)
tot-=A[i][j]*X[j];
X[i]=tot/A[i][i];
}
/*
for(int i=1;i<=N;++i)
printf("%lf ",X[i]);
*/
}
int main()
{
int a,b,c;
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,&b,&c);
++ad[a][b];
MO[i][0]=a;
MO[i][1]=b;
MO[i][2]=c;
}
long double lol = 1e16;
for(int i=1;i<=N;++i)
{
for(int j=1;j<=N;++j)
if(i!=j)
{
A[i-1][j-1]+=(ad[i][j]+ad[j][i]);
A[i-1][i-1]-=(ad[i][j]+ad[j][i]);
}
A[i-1][N]=0;
if(i==N) A[i-1][N]=lol;
}
--N;
gauss();
++N;
long double bst=2000000000;
for(int i=1;i<=M;++i)
{
a=MO[i][0];
b=MO[i][1];
c=MO[i][2];
long double cat=ab(X[b-1]-X[a-1]);
bst=min(bst,(double)c/cat);
}
printf("%Lf",(long double)bst*lol);
return 0;
}