Pagini recente » Cod sursa (job #3231995) | Cod sursa (job #323477) | Cod sursa (job #3131965) | Cod sursa (job #2781303) | Cod sursa (job #323486)
Cod sursa(job #323486)
#include <cstdio>
#include <vector>
using namespace std;
const int N_MAX = 256;
int n,m;
vector< pair<int,int> > G[N_MAX];
double a[N_MAX][N_MAX];
void get_matrix() {
for (int k = 0; k < n-1; ++k) {
int sum = 0;
for (vector< pair<int,int> >::iterator next = G[k].begin(); next != G[k].end(); ++next) {
a[k][next->first] = (double) 1 / G[k].size();
sum += next->second;
}
a[k][n] = (double) -sum / G[k].size();
a[k][k] = -1;
}
a[n-1][n-1] = -1;
#ifdef DEBUG
for (int i = 0; i < n; ++i) {
for (int j = 0; j <= n; ++j) {
printf("%.2lf ",a[i][j]);
}
printf("\n");
}
printf("\n");
#endif
}
bool is_zero ( int k ) {
for (int i = 0; i < n; ++i)
if (a[k][i] != 0)
return false;
return true;
}
void swap ( int x, int y ) {
double aux;
for (int i = 0; i < n; ++i) {
aux = a[x][i];
a[x][i] = a[y][i];
a[y][i] = aux;
}
}
void add ( int x, int y, double coe ) {
for (int i = 0; i <= n; ++i)
a[x][i] += a[y][i] * coe;
}
void gauss() {
int lin = 0, col = 0;
for (; lin < n && col < n; ++lin, ++col) {
if (a[lin][col] == 0) {
int k = lin+1;
while (k < n && is_zero(k)) ++k;
swap(lin,k);
}
for (int k = 0; k < n; ++k)
if (k != lin)
add(k,lin,-a[k][col]/a[lin][col]);
#ifdef DEBUG
for (int i = 0; i < n; ++i) {
for (int j = 0; j <= n; ++j) {
printf("%.2lf ",a[i][j]);
}
printf("\n");
}
printf("\n");
#endif
}
}
int main() {
freopen("tunel.in","rt",stdin);
freopen("tunel.out","wt",stdout);
scanf("%d %d",&n,&m);
for (int i = 0, a,b,c; i < m; ++i) {
scanf("%d %d %d",&a,&b,&c);
--a; --b;
G[a].push_back(make_pair(b,c));
G[b].push_back(make_pair(a,c));
}
get_matrix();
gauss();
double ans = a[0][n] / a[0][0];
printf("%lf\n",ans);
return 0;
}