Cod sursa(job #847743)

Utilizator stoicatheoFlirk Navok stoicatheo Data 4 ianuarie 2013 14:01:11
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>
#include <cstring>
#include <iomanip>
 
#define NMAX 256
 
using namespace std;
 
ifstream in;
ofstream out;
 
int cnt[NMAX][NMAX];
double g[NMAX][NMAX];
int cost[NMAX][NMAX];
int grad[NMAX];
double t[NMAX];
 
int main()
{
    int M,N,x,y,c;
 
    memset(grad,0,sizeof(grad));
    memset(cnt,0,sizeof(cnt));
 
    in.open("tunel.in");
 
    in>>N>>M;
    for(int i=1;i<=M;++i)
    {
        in>>x>>y>>c;
        cost[y][x]+=c;
        cost[x][y]+=c;
        ++cnt[x][y];
        ++cnt[y][x];
        ++grad[x];
        ++grad[y];
    }
 
    in.close();
 
    memset(t,0,sizeof(t));
    memset(g,0,sizeof(g));
 
    for(int i=1;i<N;++i)
    {
        g[i][i]=grad[i];
        for(int j=1;j<=N;++j)
            if(cost[i][j])
            {
                if(j!=N) g[i][j]-=cnt[i][j];
                g[i][N]+=cost[i][j];
            }
 
        for(int j=1;j<=N;++j)
            g[i][j]/=grad[i];
    }
 
    for(int i=1;i<N;++i)
    {
        if(g[i][i]!=1)
        {
            for(int j=i+1;j<=N;++j) g[i][j]/=g[i][i];
            g[i][i]=1;
        }
 
        for(int r=i+1;r<N;++r)
            if(g[r][i]!=0)
            {
                for(int j=i+1;j<=N;++j)
                    g[r][j]-=g[r][i]*g[i][j];
                g[r][i]=0;
            }
    }
 
    for(int i=N-1;i>0;--i)
    {
        t[i]=g[i][N];
        for(int j=i+1;j<N;++j)
            t[i]-=t[j]*g[i][j];
    }
 
    out.open("tunel.out");
 
    out<<fixed<<setprecision(3)<<t[1]<<'\n';
 
    out.close();
 
    return 0;
}