#include #include #include #define TRUE 1 #define FALSE 0 #define NEDEFINISANO -1 #define INF -1 typedef struct { int u; int v; int w; } Veza; Veza *veza; int manji( int x, int y ) { if ( x == INF ) return FALSE; if ( y == INF ) return TRUE; return x < y; } int dajNajboljeg( int *obidjen, int *key, int n ) { int minCvor = NEDEFINISANO; int minKey = INF; for ( int i = 1; i <= n; i++ ) if ( !obidjen[ i ] && manji( key[ i ], minKey ) ) { minKey = key[ i ]; minCvor = i; } return minCvor; } int main() { int n, m; scanf("%d%d", &n, &m ); int **graf = ( int ** ) malloc( ( n + 1 ) * sizeof( int * ) ); int *prethodnik = ( int * ) malloc( ( n + 1 ) * sizeof( int ) ); int *obidjen = ( int * ) malloc( ( n + 1 ) * sizeof( int ) ); int *key = ( int * ) malloc( ( n + 1 ) * sizeof( int ) ); Veza *veza = ( Veza * ) malloc( ( m + 1 ) * sizeof( Veza ) ); for ( int i = 1; i <= n; i++ ) { graf[ i ] = ( int * ) malloc( ( n + 1 ) * sizeof( int ) ); prethodnik[ i ] = NEDEFINISANO; obidjen[ i ] = FALSE; key[ i ] = INF; } for ( int i = 1; i <= n; i++ ) for ( int j = 1; j <= n; j ++ ) graf[ i ][ j ] = INF; for ( int i = 1; i <= m; i++ ) scanf("%d%d%d", &veza[ i ].u, &veza[ i ].v, &veza[ i ].w ); int p, q; scanf("%d%d", &p, &q ); for ( int i = 1; i <= m; i ++ ) { if ( veza[ i ].w % p == 0 ) veza[ i ].w = ( veza[ i ].w / p - 1 ) * q; else veza[ i ].w = veza[ i ].w / p * q; graf[ veza[ i ].u ][ veza[ i ].v ] = graf[ veza[ i ].v ][ veza[ i ].u ] = veza[ i ].w; } int start = 1; int suma = 0; key[ start ] = 0; int u; while ( ( u = dajNajboljeg( obidjen, key, n ) ) != NEDEFINISANO ) { obidjen[ u ] = TRUE; suma += key[ u ]; // dodata veza ( prethodnik[ u ], u ) for ( int v = 1; v <= n; v ++ ) if ( graf[ u ][ v ] != INF && !obidjen[ v ] && manji( graf[ u ][ v ], key[ v ] ) ) { key[ v ] = graf[ u ][ v ]; prethodnik[ v ] = u; } } printf("%d\n", suma ); return 0; }