Cod sursa(job #134699)

Utilizator ViksenVictor-Nicolae Savu Viksen Data 12 februarie 2008 08:12:24
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#include <string.h>

struct dd { int x; double y; int z; } Q[2][200000];
struct point { int v,c; point *l; } *G[226];
int N[226];
double s;

void edge ( int x , int y , int c)
{
    point *p = new point;
    p->v=y;
    p->c=c;
    p->l=G[x];
    G[x]=p;
}

int main ()
{
    int i,j,x,y,c,n,m, q[] = {0,0};
    point *p;
    freopen ( "tunel.in" , "r" , stdin );
    scanf ( "%d %d" , &n , &m );
    for ( i=0 ; i<n ; i++ ) {
        scanf ( "%d %d %d" , &x , &y , &c );
        edge ( x , y ,c ); N[x]++; N[y]++;
        edge ( y , x , c );
    }
    fclose ( stdin );

    m=15/m;
    Q[0][0].x=1; Q[0][0].y=1; Q[0][0].z=0; q[0]=1;
    for ( i=0 ; i<=m ; i++ ) {
        for ( j=0 ; j<q[i&1] ; j++ ) {
            for ( p=G[ Q[i&1][j].x ]; p ; p=p->l ) {
                Q[!(i&1)][q[!(i&1)]].x = p->v;
                Q[!(i&1)][q[!(i&1)]].y = Q[i&1][j].y / N[Q[i&1][j].x];
                Q[!(i&1)][q[!(i&1)]].z = Q[i&1][j].z + p->c;
                if (p->v==n) s+=Q[!(i&1)][q[!(i&1)]].y*Q[!(i&1)][q[!(i&1)]].z; 
                        else q[!i]++;
            }
        memset ( &Q[i&1][j] , 0 , sizeof ( dd ) );
        }
    	q[i&1]=0;
	}

    freopen ( "tunel.in" , "w" , stdout );
    printf ( "%.4lf\n" , s ); 
    fclose ( stdout );

    return 0;
}