Pagini recente » Cod sursa (job #3226484) | Cod sursa (job #1237942)
#include <iostream>
#include <cmath>
#include <algorithm>
#include <fstream>
#include <iomanip>
#include <vector>
#define NMAX 260
#define EPS 1.e-5
using namespace std;
struct node {
int st;
double cost;
};
vector<node> G[NMAX];
int N;
double val[NMAX][NMAX];
double ans[NMAX];
inline void sl(int x, int y) {
for(int i = 1; i <= N + 1; ++i) {
swap(val[x][i], val[y][i]);
}
}
int main()
{
ifstream cin("tunel.in");
ofstream cout("tunel.out");
int N, M, x, y;
double c;
cin >> N >> M;
for(int i = 1; i <= M; ++i) {
cin >> x >> y >> c;
node n1, n2;
n1.st = x, n2.st = y;
n1.cost = n2.cost = c;
G[x].push_back(n2);
G[y].push_back(n1);
}
for(int i = 1; i < N; ++i) {
for(int j = 1; j <= N; ++j) {
val[i][j] = 0;
}
val[i][i] = -1;
double imp = 1.0 / G[i].size();
for(int k = 0; k < G[i].size(); ++k) {
val[i][G[i][k].st] += imp;
val[i][N + 1] -= imp * G[i][k].cost;
}
}
val[N][N] = 1;
int cur = 1;
for(int i = 1; i <= N; ++i) {
if(fabs(val[cur][i]) < EPS) {
for(int j = cur + 1; j <= N; ++j){
if(fabs(val[j][i]) >= EPS) {
sl(cur, j);
break;
}
}
}
for(int j = 1; j <= N; ++j) {
if(j != cur){
double inm = val[j][i] / val[i][i];
for(int k = 1; k <= N + 1; ++k) {
val[j][k] -= val[i][k] * inm;
}
}
}
++cur;
}
cur = 1;
for(int i = 1; i <= N; ++ i) {
if(val[cur][i]) {
ans[i] = val[cur][N + 1] / val[cur][i];
++cur;
}
}
cout << fixed << setprecision(4) << ans[1];
return 0;
}