Cod sursa(job #388821)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 31 ianuarie 2010 00:49:13
Problema Flux Scor 88
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 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;
    }
    
    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]=1;
    }
    
    --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);
    
    return 0;
}