Cod sursa(job #890566)

Utilizator ELHoriaHoria Cretescu ELHoria Data 25 februarie 2013 10:29:18
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstdlib>

using namespace std; 

#define REP(i,n) for(int i = 0;i<(int)n;++i)
#define pii pair<int,int>
#define x first
#define y second
#define mp make_pair

#define eps 1e-6

ifstream cin("test.in");
ofstream cout("test.out");

const int nmax = 256;
vector< pii > G[nmax];
double X[nmax][nmax], S[nmax];
int N, M;

void readData() {
	cin>>N>>M;
	for(int i = 0;i < M;i++) {
		int a, b, c;
		cin>>a>>b>>c;
		G[a].push_back(mp(b,c));
		G[b].push_back(mp(a,c));
	}
}

void gauss() {
	int i = 1,j = 1, k;
	while(i <= N && j <= N) {
		for(k = i;k <= N;k++) {
			if(fabs(X[k][j]) > eps) {
				break;
			}
		}
		if(k == N + 1) {
			j++;
			continue;
		}
		if(i != k) {
			for(int w = 1;w <= N + 1;w++) {
				swap(X[i][w],X[k][w]);
			}
		}
         for (int a = 1; a <= N; ++a) if (a != j) {
            double r = -X[a][j]/X[j][j];
            for (int k = 1; k <= N; ++k)
                X[a][k] += r * X[j][k];
            X[a][N + 1] += r * X[j][N + 1];
        }
        ++i; ++j;
	}
}

void solve() {
	X[N][N] = 1.0;
	X[N][N + 1] = 0.0;
	for(int i = 1;i < N;i++) {
		double a = 1.0/G[i].size();
		X[i][i] = 1.0;	
		for(vector< pii >::const_iterator w = G[i].begin();w != G[i].end();w++) {
			X[i][w->x] -= a;
			X[i][N + 1] += w->y*a;
		}
		
	}

	gauss();

	cout.precision(6);
	cout<<fixed<<X[1][N + 1];
}

int main()
{
	readData();
	solve();
	cout<<0;
	return 0;
}