Pagini recente » Cod sursa (job #871703) | Cod sursa (job #614243) | Cod sursa (job #2211773) | Cod sursa (job #307886) | Cod sursa (job #1967692)
/**
* 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;
}