Cod sursa(job #2614782)

Utilizator bogdi1bogdan bancuta bogdi1 Data 12 mai 2020 18:05:15
Problema Flux Scor 0
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int INF = 1000000000;
int cost[105][105];
int drum[105][105];
const double eps = 1e-3;
double mat[105][105];
double sol[105];
bool viz[105];
int n;
void dfs(int nod)
{
    viz[nod]=1;
    for(int i=1; i<=n; i++)
        if(viz[i]==0 && drum[nod][i])
            dfs(i);
}
int main()
{   freopen("flux.in", "r", stdin);
    freopen("flux.out", "w", stdout);
    int m,i,j,x,y,z,k,l;
    scanf("%d%d", &n, &m);
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            cost[i][j]=INF;
    for(i=1; i<=m; i++){
        scanf("%d%d%d", &x, &y, &z);
        cost[x][y]=min(cost[x][y], z);
        cost[y][x]=cost[x][y];
        drum[x][y]++;
        drum[y][x]++;
    }
    dfs(1);
    if(viz[n]==0){
        printf("0.000");
        return 0;
    }
    for(i=2; i<=n; i++)
        for(j=1; j<=n; j++)
            if(i!=j){
                mat[i][j]=drum[i][j];
                mat[i][i]-=drum[i][j];
            }
    mat[n][n+1]=-1;
    for(i=2,j=2; i<=n && j<=n; i++,j++){
        for(k=i; k<=n; k++){
            if(mat[k][j]<=-eps || mat[k][j]>=eps){
                for(l=1; l<=n+1; l++)
                    swap(mat[k][l], mat[i][l]);
                break;
            }
        }
        if(mat[i][j]>=-eps && mat[i][j]<=eps){
            i--;
            continue;
        }
        for(k=j+1; k<=n+1; k++)
            mat[i][k]/=mat[i][j];
        mat[i][j]=1;
        for(k=i+1; k<=n; k++){
            for(l=j+1; l<=n+1; l++)
                mat[k][l]-=mat[k][j]*mat[i][l];
            mat[k][j]=0;
        }
    }
    for(i=n; i>=2; i--)
        for(j=2; j<=n+1; j++){
            if(mat[i][j]<=-eps || mat[i][j]>=eps){
                sol[j]=mat[i][n+1];
                for(l=j+1; l<=n; l++)
                    sol[j]-=mat[i][l]*sol[l];
                break;
            }
        }
    double res=INF;
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            if(i!=j && drum[i][j])
                if(fabs(sol[i]-sol[j])>eps)
                    res=min(res, 1.0*cost[i][j]/fabs(sol[i]-sol[j]));
    printf("%.3lf", res);
    return 0;
}