Cod sursa(job #195725)

Utilizator hadesgamesTache Alexandru hadesgames Data 21 iunie 2008 08:31:14
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#include <vector>
#include <queue>
#include <list>
#include <set>
#include <algorithm>
#include <utility>
#include <string>
using namespace std;
#define FOR(i,a,b) for(typeof a i=a;i<=b;i++)
#define fori(it,v) for (typeof ((v).begin()) it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define mp make_pair
#define fs first
#define ss second
#define all(c) c.begin(),c.end()
double dist,prob,sol[300],b[300][300];
vector <vector<pair<int,int> > > a(300);

int main()
{
	FILE *in,*out;
	int n,m,x,y,z;
	in=fopen("tunel.in","r");
	out=fopen("tunel.out","w");
	fscanf(in,"%d%d",&n,&m);
	FOR(i,1,m)
	{
		fscanf(in,"%d%d%d",&x,&y,&z);
		a[x].pb(mp(y,z));
		a[y].pb(mp(x,z));
	}
	FOR(i,1,n-1)
	{
		b[i][i]=1;
		int prob=a[i].size();
		int dist= 0;
		fori(it,a[i])
		{
			dist+=it->ss;
			b[i][it->fs]+=-1.0/prob;
		}
		b[i][n+1]=((double)dist)/prob;
	}
	FOR(i,1,n-1)
	{
		int poz=-1;
		FOR(j,i,n)
		if (b[j][i])
		{
			poz=j;
			break;
		}
		FOR(j,1,n+1)
			swap(b[i][j],b[poz][j]);
		FOR(j,(i+1),n)
		{
			double chestie=-b[j][i]/b[i][i];
			FOR(k,1,n+1)
				b[j][k]+=chestie*b[i][k];

		}

	}
	for (int i=n-1;i>=1;i--)
	{
		double sum=0;
		FOR(j,(i+1),n)
			sum+=b[i][j]*sol[j];
		sol[i]=(b[i][n+1]-sum)/b[i][i];
	}
	fprintf(out,"%lf\n",sol[1]);
	fclose(in);
	fclose(out);
	return 0;
}