Cod sursa(job #135919)

Utilizator andrei.12Andrei Parvu andrei.12 Data 14 februarie 2008 20:52:05
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include<stdio.h>
#include<vector>

using namespace std;

#define lg 250005

vector<int> cuoada[1005];
int *v[lg], *vc[lg];
int n, m, np, nf, x, y, cst, i, j, k, nod, maxcost, nr[lg], nrp[1005], d[lg];
struct kkt{
	int x, y, cst;
};
kkt ceampus[500005];
void citire(){
	int kkt = 0, j, nt;
	char sir[50];
	fgets(sir, 50, stdin), nt = 0;
	
	for (j = nt; sir[j] <= '9' && sir[j] >= '0'; j ++)
		kkt = kkt*10+sir[j]-'0';
	x = kkt, kkt = 0;
	nt = j+1;
	for (j = nt; sir[j] <= '9' && sir[j] >= '0'; j ++)
		kkt = kkt*10+sir[j]-'0';
	y = kkt, kkt = 0;
	nt = j+1;
	for (j = nt; sir[j] <= '9' && sir[j] >= '0'; j ++)
		kkt = kkt*10+sir[j]-'0';
	cst = kkt;
}
inline int max(int a, int b){
	if (a < b)
		return b;
	return a;
}
int main()
{
	freopen("pscnv.in", "rt", stdin);
	freopen("pscnv.out", "wt", stdout);
	
	scanf("%d%d%d%d\n", &n, &m, &np, &nf);
	for (i = 1; i <= m; i ++){
		//scanf("%d%d%d", &x, &y, &cst);
		citire();
		ceampus[i].x = x, ceampus[i].y = y, ceampus[i].cst = cst;
		
		if (x != y){
			nr[x] ++;
			
			maxcost = max(maxcost, cst);
		}
	}
	for (i = 1; i <= n; i ++){
		v[i] = (int*)realloc(v[i], (nr[i]+1)*sizeof(int));
		vc[i] = (int*)realloc(vc[i], (nr[i]+1)*sizeof(int));
		nr[i] = 0;
	}
	
	for (i = 1; i <= m; i ++){
		x = ceampus[i].x, y = ceampus[i].y, cst = ceampus[i].cst;
		nr[x] ++;
		
		v[x][nr[x]] = y;
		vc[x][nr[x]] = cst;
	}
	
	nrp[0] = 1;
	cuoada[0].push_back(np);
	d[np] = 0;
	for (i = 0; i <= maxcost; i ++)
		for (j = 0; j < nrp[i]; j ++){
			x = cuoada[i][j];
			if (x == nf){
				printf("%d\n", i);
				return 0;
			}
			
			for (k = 1; k <= nr[x]; k ++){
				nod = v[x][k];
				cst = vc[x][k];
				
				if (cst < i){
					if ((d[nod] == 0 && nod != np) || d[nod] > i){
						d[nod] = i;
						nrp[i] ++;
						cuoada[i].push_back(nod);
					}
				}
				else
					if ((d[nod] == 0 && nod != np) || d[nod] > cst){
						d[nod] = cst;
						nrp[cst] ++;
						cuoada[cst].push_back(nod);
					}
			}
		}
	
	return 69;
}