Cod sursa(job #1722832)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 29 iunie 2016 00:12:19
Problema Flux Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#define MAXN 110
#define INF 1000000000
#define EPS 1e-7
using namespace std;
vector<pair<int,int> > g[MAXN];
int n,m,seen[MAXN];
double equation[MAXN][MAXN],capacity[MAXN][MAXN],value[MAXN];
int edges[MAXN][MAXN];
void DFS(int node){
    int i;
    seen[node]=1;
    for(i=1;i<=n;i++)
        if(edges[node][i]>0&&seen[i]==0)
            DFS(i);
}
bool IsZero(double x){
    if(x>=-EPS&&x<=EPS)
        return true;
    return false;
}
int main(){
    freopen("flux.in","r",stdin);
    freopen("flux.out","w",stdout);
    int i,j,k,l,a,b,c;
    double temp,answer=INF;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            capacity[i][j]=INF;
    for(i=1;i<=m;i++){
        scanf("%d%d%d",&a,&b,&c);
        edges[a][b]++;
        edges[b][a]++;
        capacity[a][b]=capacity[b][a]=min(capacity[a][b],(double)c);
    }
    DFS(1);
    if(seen[n]==0){
        printf("0.000");
        return 0;
    }
    for(i=2;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i!=j){
                equation[i][j]=edges[i][j];
                equation[i][i]-=edges[i][j];
            }
    equation[n][n+1]=-1;
    i=j=2;
    while(i<=n&&j<=n){
        k=i;
        while(k<=n&&IsZero(equation[k][j])==true)
            k++;
        if(k==n+1){
            j++;
            continue;
        }
        if(k!=i)
            for(l=1;l<=n+1;l++){
                temp=equation[i][l];
                equation[i][l]=equation[k][l];
                equation[k][l]=temp;
            }
        for(l=j+1;l<=n+1;l++)
            equation[i][l]/=equation[i][j];
        equation[i][j]=1;
        for(k=i+1;k<=n;k++){
            for(l=j+1;l<=n+1;l++)
                equation[k][l]=equation[k][l]-equation[i][l]*equation[k][j];
            equation[k][j]=0;
        }
        i++;
        j++;
    }
    for(i=n;i>=2;i--)
        for(j=2;j<=n+1;j++)
            if(IsZero(equation[i][j])==false){
                value[j]=equation[i][n+1];
                for(k=j+1;k<=n;k++)
                    value[j]=value[j]-value[k]*equation[i][k];
                break;
            }
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i!=j&&edges[i][j]>0){
                temp=value[i]-value[j];
                if(IsZero(temp)==true)
                    continue;
                if(temp<0)
                    temp=-temp;
                answer=min(answer,capacity[i][j]/temp);
            }
    printf("%.3f",answer);
    return 0;
}