Cod sursa(job #1967692)

Utilizator andrei.arnautuAndi Arnautu andrei.arnautu Data 16 aprilie 2017 22:49:40
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
/**
  *  Worg
  */
#include <cstdio>
#include <vector>
#include <utility>

FILE *fin = freopen("tunel.in", "r", stdin);
FILE *fout = freopen("tunel.out", "w", stdout);

const int kMaxN = 260;
const double eps = 1e-10;

/*-------- Input data --------*/
int N, M;
std::vector<std::pair<int, int > > graph[kMaxN];
/*-------- Gauss data --------*/
double sys[kMaxN][kMaxN];
double x[kMaxN];
/*-------- --------*/

void ReadInput() {
	scanf("%d%d", &N, &M);
	for(int i = 1; i <= M; i++) {
		int u, v, d; scanf("%d%d%d", &u, &v, &d);
        graph[u].push_back(std::make_pair(v, d)); graph[v].push_back(std::make_pair(u, d));
	}
}

void Initialize() {
	for(int i = 1; i <= N; i++) {
		sys[i][i] = -1.0;
		for(auto& edge : graph[i]) {
			sys[i][edge.first] += (double)1.0 / graph[i].size();
			sys[i][N + 1] -= (double) 1.0 * edge.second / graph[i].size();
		}
	}
}

void GaussAlgorithm() {
    int i = 1, j = 1;
    while(i <= N && j <= N) {
		int line, col;
		for(line = i; line <= N; line++) {
			if(sys[line][j] < -eps || eps < sys[line][j]) {
				break;
			}
		}

		if(line == N + 1) {  //  Necunoscuta libera
			j ++;
		} else {
            for(col = 1; col <= N + 1; col++) {
				std::swap(sys[i][col], sys[line][col]);
            }
            for(col = N + 1; col >= j; col--) {
				sys[i][col] /= sys[i][j];
            }
            for(line = i + 1; line <= N; line++) {
				for(col = j + 1; col <= N + 1; col++) {
					sys[line][col] -= sys[line][j] * sys[i][col];
				}
				sys[line][j] = 0;
            }
		}
		i ++; j ++;
    }

    for(i = N; i >= 1; i--) {
		for(j = 1; j <= M + 1; j++) {
			if(sys[i][j] < -eps || eps < sys[i][j]) {
                x[j] = sys[i][N + 1];
                for(int col = j + 1; col <= N; col++) {
					x[j] -= x[col] * sys[i][col];
                }
                break;
			}
		}
    }

    printf("%.6f\n", x[1]);
}

int main() {
	ReadInput();
	Initialize();
	GaussAlgorithm();
	return 0;
}