Cod sursa(job #504498)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 27 noiembrie 2010 21:40:23
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#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;
}