Cod sursa(job #920200)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 20 martie 2013 09:25:47
Problema Amenzi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<stdio.h>

#define inf (1<<29)
#define maxn 153
#define maxt 3500

FILE*f=fopen("amenzi.in","r");
FILE*g=fopen("amenzi.out","w");

int n,m,k,q;
int dist[maxn][maxn],S[maxt+5][maxn],D[maxt+5][maxn];

inline int min ( const int &a , const int &b ){
	return a <= b ? a : b;
}

inline int max ( const int &a , const int &b ){
	return a >= b ? a : b;
}

int main () {
	
	fscanf(f,"%d %d %d %d",&n,&m,&k,&q);
	
	for ( int i = 1 ; i <= n ; ++i ){
		for ( int j = 1 ; j <= n ; ++j ){
			dist[i][j] = inf;
		}
	}
	
	int x,y,c;
	for ( int i = 1 ; i <= m ; ++i ){
		fscanf(f,"%d %d %d",&x,&y,&c);
		dist[x][y] = dist[y][x] = min(dist[x][y],c);
	}
	
	for ( int p = 1 ; p <= n ; ++p ){
		for ( int i = 1 ; i <= n ; ++i ){
			for ( int j = 1 ; j <= n ; ++j ){
				
				if ( dist[i][j] > dist[i][p] + dist[p][j] ){
					dist[i][j] = dist[i][p] + dist[p][j];
				}					
			}
		}
	}
	
	for ( int i = 1 ; i <= k ; ++i ){
		fscanf(f,"%d %d %d",&x,&y,&c);
		S[y][x] += c;
	}
	
	for ( int i = 0 ; i <= maxt ; ++i ){
		for ( int j = 1 ; j <= n ; ++j ){
			D[i][j] = -1;
		}
	}
	D[0][1] = 0;
	
	for ( int t = 0 ; t < maxt ; ++t ){
		
		for ( int i = 1 ; i <= n ; ++i ){
			if ( D[t][i] == -1 )	continue ;
			
			D[t][i] += S[t][i];
			D[t+1][i] = max(D[t+1][i],D[t][i]);
			
			if ( S[t][i] || i == 1 ){
				for ( int j = 1 ; j <= n ; ++j ){
					int nextt = t+dist[i][j];
					D[nextt][j] = max(D[nextt][j],D[t][i]);
				}
			}
		}
	}
	
	for ( int i = 1 ; i <= q ; ++i ){
		fscanf(f,"%d %d",&x,&y);
		fprintf(g,"%d\n",D[y][x]);
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}