Cod sursa(job #708792)

Utilizator mihai995mihai995 mihai995 Data 7 martie 2012 10:51:32
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
using namespace std;

const int N=261;
double v[N][N];
int n,m;

ifstream in("tunel.in");
ofstream out("tunel.out");

inline void sch(double &a,double &b)
{
    double c=a;a=b;b=c;
}

void sch(double a[],double b[])
{
    for (int i=1;i<=m+1;i++)
        sch(a[i],b[i]);
}

int find(int x,int i)
{
    for (;i<=n;i++)
        if (v[i][x]!=0)
            return i;
    return -1;
}

void reduce(double a[],double b[],double x)
{
    for (int i=1;i<=m+1;i++)
        a[i]-=x*b[i];
}

int gauss()
{
    int L=1,i,j;
    for (i=1;i<=m;i++)
    {
        j=find(i,L);
        if (j==-1)
            continue;
        if (j!=L)
            sch(v[j],v[L]);
        double x=v[L][i];
        for (j=1;j<=m+1;j++)
            v[L][j]/=x;
        for (int j=1;j<=n;j++)
            if (j!=L)
                reduce(v[j],v[L],v[j][i]);
        L++;
    }
    return v[1][m+1];
}

void work(int x,int y,int c)
{
    if (x==n)
        return;
    v[x][x]++;
    v[x][n]+=c;
    if (y!=n)
        v[x][y]--;
}

int main()
{
    int x,y,c;
    in>>n>>m;
    while (m--)
    {
        in>>x>>y>>c;
        work(x,y,c);
        work(y,x,c);
    }
    n--;
    m=n;
    out<<gauss()<<"\n";
    return 0;
}