Pagini recente » Cod sursa (job #1156662) | Cod sursa (job #2161136) | Cod sursa (job #1422127) | Cod sursa (job #1521991) | Cod sursa (job #919413)
Cod sursa(job #919413)
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <vector>
using namespace std;
const double eps = 0.0001;
int N, M;
vector<pair<int, int> > V[260];
double A[260][260], X[260];
int main()
{
ifstream fin("tunel.in");
ofstream fout("tunel.out");
fin >> N >> M;
for (int i = 1, nod1, nod2, cost; i <= M; ++i)
{
fin >> nod1 >> nod2 >> cost;
V[nod1].push_back(make_pair(nod2, cost));
V[nod2].push_back(make_pair(nod1, cost));
}
for (int i = 1; i <= N; ++i)
{
A[i][i] -= 1.0;
if (i == N) continue;
int grad = V[i].size(), sumdist = 0;
for (vector<pair<int, int> >::iterator it = V[i].begin(); it != V[i].end(); ++it)
{
sumdist += it->second;
A[i][it->first] += 1.0 / grad;
}
A[i][N + 1] -= 1.0 * sumdist / grad;
}
for (int i = 1, j = 1; i <= N && j <= N; ++i)
{
int findnow = 0;
for (findnow = i; findnow <= N && A[i][j] == 0; ++findnow);
if (findnow == N + 1)
{
--i;
++j;
continue;
}
for (int k = 1; k <= N + 1; ++k)
swap(A[i][k], A[findnow][k]);
double rednow = A[i][j];
for (int k = 1; k <= N + 1; ++k)
A[i][k] /= rednow;
for (int k = i + 1; k <= N; ++k)
{
rednow = A[k][j];
for (int l = 1; l <= N + 1; ++l)
A[k][l] -= A[i][l] * rednow;
}
++j;
}
for (int i = N; i >= 1; --i)
for (int j = 1; j <= N + 1; ++j)
if (A[i][j] < -eps || A[i][j] > eps)
{
X[j] = A[i][N + 1];
for (int k = i - 1; k >= 1; --k)
{
A[k][N + 1] -= X[j] * A[k][j];
A[k][j] = 0;
}
break;
}
fout << fixed << setprecision(6) << X[1] << '\n';
fin.close();
fout.close();
}