Cod sursa(job #423064)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 23 martie 2010 14:35:59
Problema Flux Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#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;
    }

    double lol = 1e-8;

    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;

    double bst=2000000000;

    for(int i=1;i<=M;++i)
    {
        a=MO[i][0];
        b=MO[i][1];
        c=MO[i][2];

        double cat=ab(X[b-1]-X[a-1]);

        bst=min(bst,(double)c/cat);
    }

    printf("%lf",bst*lol);

    return 0;
}