Pagini recente » Cod sursa (job #36704) | Cod sursa (job #3225405) | Cod sursa (job #2811832) | Cod sursa (job #110482)
Cod sursa(job #110482)
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
#define x first
#define y second
#define PB push_back
#define MP make_pair
const double eps = 1e-8;
const int NMAX = 256;
int N, M;
vector <PII> G[NMAX];
double A[NMAX][NMAX];
void read(void) {
FILE *fin = fopen("tunel.in", "rt");
int i, u, v, c;
fscanf(fin, " %d %d", &N, &M);
for (i = 0; i < M; ++i) {
fscanf(fin, " %d %d %d", &u, &v, &c);
G[u].PB( MP(v, c) );
G[v].PB( MP(u, c) );
}
fclose(fin);
}
void init(void) {
int i;
double c;
vector <PII> :: iterator j;
for (i = 1; i < N; ++i) {
c = 1. / G[i].size();
A[i][i] = -1.;
for (j = G[i].begin(); j != G[i].end(); ++j) {
if (j->x != N)
A[i][j->x] += c;
A[i][0] -= c * j->y;
}
}
}
void gauss(void) { // sort of...
int i, j, k, poz;
double c;
init();
for (i = N - 1; i > 1; --i) {
poz = 0;
for (j = i; j && poz == 0; --j)
if (fabs(A[j][i]) > eps)
poz = j;
if (poz == 0) continue;
for (j = 0; j <= i; ++j)
swap(A[poz][j], A[i][j]);
for (j = 1; j < i; ++j) {
c = A[j][i] / A[i][i];
for (k = 0; k < i; ++k)
A[j][k] -= c * A[i][k];
}
}
}
void write(void) {
FILE *fout = fopen("tunel.out", "wt");
fprintf(fout, "%lf\n", A[1][0] / A[1][1]);
fclose(fout);
}
int main(void) {
read();
gauss();
write();
return 0;
}