Cod sursa(job #1736643)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 2 august 2016 13:09:36
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include<cstdio>
#include<cmath>
#include<algorithm>
#define MAXN 260
#define MAXM 100010
#define EPS 1e-8
using namespace std;
int n,m,a[MAXM],b[MAXM],c[MAXM];
int degree[MAXN];
double equation[MAXN][MAXN],value[MAXN],answer[MAXN];
void Gauss(){
    int i,j,k,p,q;
    double temp;
    for(i=1;i<=n;i++)
        equation[i][i]=-1.0;
    for(i=1;i<=m;i++){
        equation[a[i]][b[i]]+=(double)1.0/degree[a[i]];
        equation[b[i]][a[i]]+=(double)1.0/degree[b[i]];
        value[a[i]]-=1.0*c[i]/degree[a[i]];
        value[b[i]]-=1.0*c[i]/degree[b[i]];
    }
    n--;
    i=j=1;
    while(i<=n&&j<=n){
        k=i;
        while(k<=n&&fabs(equation[k][j])<EPS)
            k++;
        if(k==n+1){
            j++;
            continue;
        }
        for(p=1;p<=n;p++)
            swap(equation[i][p],equation[k][p]);
        swap(value[i],value[k]);
        for(p=j+1;p<=n;p++)
            equation[i][p]/=equation[i][j];
        value[i]/=equation[i][j];
        equation[i][j]=1.0;
        for(k=i+1;k<=n;k++){
            temp=equation[k][j];
            for(p=1;p<=n;p++)
                equation[k][p]-=temp*equation[i][p];
            value[k]-=temp*value[i];
            equation[k][j]=0;
        }
        i++;
        j++;
    }
    for(i=n;i>=1;i--){
        j=1;
        while(j<=n+1&&fabs(equation[i][j])<EPS)
            j++;
        answer[j]=value[i];
        for(k=j+1;k<=n;k++)
            answer[j]-=equation[i][k]*answer[k];
    }
    printf("%.7f",answer[1]);
}
int main(){
    freopen("tunel.in","r",stdin);
    freopen("tunel.out","w",stdout);
    int i;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++){
        scanf("%d%d%d",&a[i],&b[i],&c[i]);
        degree[a[i]]++;
        degree[b[i]]++;
    }
    Gauss();
    return 0;
}