Cod sursa(job #352977)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 3 octombrie 2009 20:44:16
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

#define file_in "tunel.in"
#define file_out "tunel.out"

#define Nmax 300
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define eps 0.001

int N,M;
//vector< pair<int, int > > V[Nmax];
double D[Nmax][Nmax];
double grad[Nmax];
char s[100];

int main()
{
	int i,j,k;

	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);

	scanf("%d %d\n",&N, &M);

	int x,y,c;

	for (i=1;i<=M;++i)
	{
		//scanf("%d %d %d", &x, &y, &c);
		gets(s);
		
		j=0;
		x=y=c=0;
		
		while(s[j]>='0' && s[j]<='9')
		{
			x=x*10+s[j]-'0';
			j++;
		}
		j++;
		while(s[j]>='0' && s[j]<='9')
		{
			y=y*10+s[j]-'0';
			j++;
		}
		j++;
		while(s[j]>='0' && s[j]<='9')
		{
			c=c*10+s[j]-'0';
			j++;
		}
		

		grad[x]++;
		grad[y]++;
		D[x][y]++;
		D[y][x]++;
		D[x][0]+=c;
		D[y][0]+=c;
	}


	for (i=1;i<N;++i)
		 for(j=0;j<N;++j)
			  D[i][j]*=(1.0/grad[i]);

	double grd;

	for (i=2;i<N;++i)
         for (j=1;j<N;++j)
		 {
			 //D[i][j]=double(1.0/D[i][i]);
			 for (k=0;k<N;++k)
             if (i!=k && i!=j) 
			 {
				  grd=(double)(1.0*(double)(1.0/(double)(1.0-D[i][i])));
				  D[j][k]=D[j][k]+D[i][k]*D[j][i]*grd;
			  }
		 }

	printf("%.5lf", (double)(1.0*(double)(1.0/(double)(1.0-D[1][1]))*D[1][0]));
    fclose(stdin);
	fclose(stdout);

	return 0;

}