Cod sursa(job #804644)

Utilizator Marius96Marius Gavrilescu Marius96 Data 30 octombrie 2012 00:31:50
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<cstdio>
#include<algorithm>
#include<vector>
using std::vector;
using std::swap;

struct str
{
	int x,c;

	str()
		{
			x=c=0;
		}

	str (int xx,int cc)
		{
			x=xx;
			c=cc;
		}
};

vector<str> v[260];

double g[230][230];
double r[230];

int n;

double gauss()
{
	for(int i=0,j=0;i<n&&j<n;i++,j++){
		if(!g[i][j])
			for(int x=i+1;x<n;x++)
				if(g[x][j]){
					for(int col=0;col<=n;col++)
						swap (g[i][col],g[x][col]);
					break;
				}

		double x=g[i][j];
		for(int col=0;col<=n;col++)
			g[i][col]/=x;
		for(int u=i+1;u<n;u++){
			double x=g[u][j];
			for(int col=0;col<=n;col++)
				g[u][col]-=g[i][col]*x;
		}
	}

	for(int i=n-1;i>=0;i--){
		int p;
		for(p=0;g[i][p]<1e-6 && g[i][p]>-1e-6;p++);
		r[p]=g[i][n];
		for(int j=n-1;j>p;j--)
			r[p]-=g[i][j]*r[j];
	}

	return r[0];
}

int main()
{
	freopen ("tunel.in","r",stdin);
	freopen ("tunel.out","w",stdout);

	int ne;
	scanf ("%d%d",&n,&ne);
	for(int i=0;i<ne;i++){
		int a,b,c;
		scanf ("%d%d%d",&a,&b,&c);
		a--,b--;
		v[a].push_back (str (b,c));
		v[b].push_back (str (a,c));
	}

	for(int i=0;i<n-1;i++){
		g[i][i]=1;
		for(vector<str>::iterator it=v[i].begin();it!=v[i].end();it++)
			g[i][it->x]=-1.0/v[i].size(),g[i][n]+=it->c;
		g[i][n]/=v[i].size();
	}
	g[n-1][n-1]=1;

	printf ("%.4lf",gauss());
	return 0;
}