Cod sursa(job #323486)

Utilizator tvladTataranu Vlad tvlad Data 12 iunie 2009 11:47:26
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <cstdio>
#include <vector>
using namespace std;

const int N_MAX = 256;

int n,m;
vector< pair<int,int> > G[N_MAX];
double a[N_MAX][N_MAX];

void get_matrix() {
	for (int k = 0; k < n-1; ++k) {
		int sum = 0;
		for (vector< pair<int,int> >::iterator next = G[k].begin(); next != G[k].end(); ++next) {
			a[k][next->first] = (double) 1 / G[k].size();
			sum += next->second;
		}
		a[k][n] = (double) -sum / G[k].size();
		a[k][k] = -1;
	}
	a[n-1][n-1] = -1;
	#ifdef DEBUG
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j <= n; ++j) {
			printf("%.2lf ",a[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	#endif
}

bool is_zero ( int k ) {
	for (int i = 0; i < n; ++i)
		if (a[k][i] != 0)
			return false;
	return true;
}

void swap ( int x, int y ) {
	double aux;
	for (int i = 0; i < n; ++i) {
		aux = a[x][i];
		a[x][i] = a[y][i];
		a[y][i] = aux;
	}
}

void add ( int x, int y, double coe ) {
	for (int i = 0; i <= n; ++i)
		a[x][i] += a[y][i] * coe;
}

void gauss() {
	int lin = 0, col = 0;
	for (; lin < n && col < n; ++lin, ++col) {
		if (a[lin][col] == 0) {
			int k = lin+1;
			while (k < n && is_zero(k)) ++k;
			swap(lin,k);
		}
		for (int k = 0; k < n; ++k)
			if (k != lin)
				add(k,lin,-a[k][col]/a[lin][col]);
		#ifdef DEBUG
		for (int i = 0; i < n; ++i) {
			for (int j = 0; j <= n; ++j) {
				printf("%.2lf ",a[i][j]);
			}
			printf("\n");
		}
		printf("\n");
		#endif
	}
}

int main() {
	freopen("tunel.in","rt",stdin);
	freopen("tunel.out","wt",stdout);
	scanf("%d %d",&n,&m);
	for (int i = 0, a,b,c; i < m; ++i) {
		scanf("%d %d %d",&a,&b,&c);
		--a; --b;
		G[a].push_back(make_pair(b,c));
		G[b].push_back(make_pair(a,c));
	}
	get_matrix();
	gauss();
	double ans = a[0][n] / a[0][0];
	printf("%lf\n",ans);
	return 0;
}