Pagini recente » Cod sursa (job #2085381) | Cod sursa (job #2107232) | Cod sursa (job #3149136) | Cod sursa (job #37071) | Cod sursa (job #49)
Cod sursa(job #49)
#include <cstdio>
using namespace std;
const char iname[] = "pscnv.in";
const char oname[] = "pscnv.out";
#define MAX_N 250001
#define MAX_K 1001
#define MAX_BUF 32
#define MAX(z, w) ((z) > (w) ? (z) : (w))
#define isnum(z) ('0' <= (z) && (z) <= '9')
struct NodArb
{
int vrf;
int cst;
NodArb * next;
} * A[MAX_N];
struct NodLst
{
int vrf;
NodLst * next;
} * beg[MAX_K], * end[MAX_K];
int V[MAX_N]; /* valoarea muchiei de cost maxim */
void add(int vrf, int k)
{
NodLst * p = new NodLst;
p -> vrf = vrf, p -> next = NULL;
if (beg[k] == NULL)
beg[k] = end[k] = p;
else
end[k] -> next = p, end[k] = p;
}
int solve(int N, int srs, int dst)
{
int i;
for (i = 1; i <= N; ++i)
V[i] = MAX_K;
add(srs, V[srs] = 0);
for (i = 0; i < MAX_K; ++i) {
for (NodLst * p = beg[i]; p; p = p -> next) {
if (V[p -> vrf] < i)
continue;
else
for (NodArb * q = A[p -> vrf]; q; q = q -> next)
if (V[q -> vrf] > MAX(i, q -> cst)) {
V[q -> vrf] = MAX(i, q -> cst);
add(q -> vrf, V[q -> vrf]);
}
}
}
return V[dst];
}
int main(void)
{
int N, M, X, Y;
int i, k;
int x, y, z;
NodArb * p;
freopen(iname, "r", stdin);
char buffer[MAX_BUF];
for (scanf("%d %d %d %d\n", &N, &M, &X, &Y), i = 0; i < M; ++i) {
fgets(buffer, MAX_BUF, stdin);
x = y = z = 0;
for (k = 0; isnum(buffer[k]); x = x * 10 + (buffer[k] - '0'), ++k) ;
for (k += 1; isnum(buffer[k]); y = y * 10 + (buffer[k] - '0'), ++k) ;
for (k += 1; isnum(buffer[k]); z = z * 10 + (buffer[k] - '0'), ++k) ;
p = new NodArb;
p -> vrf = y, p -> cst = z, p -> next = A[x], A[x] = p;
}
freopen(oname, "w", stdout);
printf("%d\n", solve(N, X, Y));
return 0;
}