Pagini recente » Borderou de evaluare (job #164015) | Borderou de evaluare (job #291253) | Cod sursa (job #581705) | Cod sursa (job #3231999) | Cod sursa (job #323483)
Cod sursa(job #323483)
#include <cstdio>
#include <vector>
using namespace std;
#define pb push_back
#define mp make_pair
#define x first
#define y second
#define forit(it, v) for (typeof(v.begin()) it = v.begin(); it != v.end(); ++it)
const int MAX_N = 256;
int n, m;
double a[MAX_N][MAX_N];
vector < pair <int, int> > v[MAX_N];
void make()
{
for (int i = 1; i < n; ++i)
{
int s = 0;
forit(it, v[i])
{
a[i][it->x] = -1.0 / v[i].size();
s += it->y;
}
a[i][n + 1] = s / v[i].size();
a[i][i] = 1;
}
a[n][n] = 1;
}
void chg(int l1, int l2)
{
for (int j = 1; j <= n + 1; ++j)
{
double aux = a[l1][j];
a[l1][j] = a[l2][j];
a[l2][j] = aux;
}
}
void op(int l1, int l2, double val)
{
for (int i = 1; i <= n + 1; ++i)
a[l1][i] += val * a[l2][i];
}
void gauss()
{
for (int i = 1; i <= n; ++i)
{
for (int j = i; i <= n; ++j)
if (a[j][i])
{
chg(i, j);
break;
}
for (int j = 1; j <= n; ++j)
if (i != j && a[j][i] != 0)
op(j, i, (double)-a[j][i] / a[i][i]);
}
}
int main()
{
int i, x, y, z;
freopen("tunel.in", "r", stdin);
freopen("tunel.out", "w", stdout);
scanf("%d %d", &n, &m);
for (i = 1; i <= m; ++i)
{
scanf("%d %d %d", &x, &y, &z);
v[x].pb(mp(y, z));
v[y].pb(mp(x, z));
}
make();
gauss();
printf("%lf\n", a[1][n + 1] / a[1][1]);
}