Pagini recente » Cod sursa (job #2550689) | Cod sursa (job #289742) | Cod sursa (job #2244284) | Cod sursa (job #2614856) | Cod sursa (job #504503)
Cod sursa(job #504503)
#include <stdio.h>
#include <vector>
using namespace std;
#define NMAX 230
#define mp make_pair
#define FOR(i, v) for(vector<pair<int, int> > ::iterator i = v.begin(); i != v.end(); ++i)
vector< pair< int ,int > > G[NMAX];
int grad[NMAX];
double a[NMAX][NMAX];
int n, m;
void gauss(){
for(int i = 1; i <= n; ++i){
int max = i;
for (int j = i + 1; j < n; ++j)
if (a[j][i] > a[max][i])
max = j;
for (int j = 0; j < n + 1; ++j) {
float t = a[max][j];
a[max][j] = a[i][j];
a[i][j] = t;
}
for(int k = i+1; k <= n; ++k)
for(int j = n+1;j >= i; --j)
a[k][j] -= a[k][i] / a[i][i] * a[i][j];
}
/* for(int i = 1; i <= n; ++i){
for(int j = 1; j <= n+1; ++j)
printf("%.0lf ", a[i][j]);
printf("\n");
}
printf("\n");*/
for(int j = n; j; --j){
if(a[j][n+1] != 0) a[j][n+1] /= a[j][j];
a[j][j] = 1;
for(int i = j-1; i; --i){
a[i][n+1] -= a[i][j] * a[j][n+1];
a[i][j] = 0;
}
}
}
void build(){
for(int i = 1; i < n; ++i){
a[i][i] = grad[i];
FOR(it, G[i]){
a[i][it->first] += -1;
a[i][n+1] += it->second;
}
}
a[n][n] = 1; a[n][n+1] = 0;
}
int main(){
freopen("tunel.in", "r", stdin);
freopen("tunel.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; ++i){
int x, y, c;
scanf("%d%d%d", &x, &y, &c);
grad[x]++;
grad[y]++;
G[x].push_back(mp(y,c));
G[y].push_back(mp(x,c));
}
build();
/* for(int i = 1; i <= n; ++i){
for(int j = 1; j <= n+1; ++j)
printf("%.0lf ", a[i][j]);
printf("\n");
}
printf("\n");*/
gauss();
printf("%lf\n" ,a[1][n+1]);
return 0;
}