Cod sursa(job #1174503)

Utilizator omerOmer Cerrahoglu omer Data 23 aprilie 2014 01:36:25
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<stdio.h>
#include<algorithm>
#include<vector>
const int N=257;
using namespace std;
FILE *f,*g;

vector< pair <int,double> > graph[N]; int n; int deg[N];

double a[N][N], sol;


void read(void){

    f=fopen("tunel.in","r");
    g=fopen("tunel.out","w");
    
    int m;
    fscanf(f,"%d%d",&n,&m);

    int i; int v1,v2; double c;
    for(i=1;i<=m;i++){
        fscanf(f,"%d%d%lf",&v1,&v2,&c);
        graph[v1].push_back(make_pair(v2,c));
        graph[v2].push_back(make_pair(v1,c));
        deg[v1]++; deg[v2]++;
    }
}

void makearray(void){

    int i;double sum;
    vector<pair<int,double> >::iterator it;
    for(i=1;i<=n-1;i++){
        
        it=graph[i].begin();
        sum=0;
        while(it != graph[i].end()){
            
            if (it->first != n) a[i][it->first]=-(double)1/deg[i];
            sum+=it->second;
            ++it;
        }
        sum/=deg[i];
        a[i][i]=1;
        a[i][n]=sum;


    }
}

void gauss(void){
    
    int i,j,k; double aux;
    for(i=1;i<=n-1;i++){

        if (a[i][i] == 0){

            for(j=i+1;j<=n-1;j++){
                if (a[j][i]){
                    for(k=1;k<=n;k++) swap(a[i][k],a[j][k]);
                    break;
                }
            }
        }

        for(j=1;j<=n-1;j++){
            if (j!=i){
                aux=a[j][i]/a[i][i];
                for(k=1;k<=n;k++)
                    a[j][k]-=aux*a[i][k];
            }
        }
    }

    sol=a[1][n]/a[1][1];;
}

int main(void){

    read();
    makearray();
    gauss();
    fprintf(g,"%lf",sol);
    

    return 0;
}