Pagini recente » Cod sursa (job #2262340) | Cod sursa (job #931878) | Borderou de evaluare (job #1036196) | Monitorul de evaluare | Cod sursa (job #169767)
Cod sursa(job #169767)
#include <stdio.h>
int n, m, sursa, dest, ok;
typedef struct nod
{
int x, c;
nod *a;
} *pNod;
pNod v[250006];
void citire()
{
freopen("pscnv.in","r",stdin);
freopen("pscnv.out","w",stdout);
char s[100];
scanf("%d %d %d %d\n",&n,&m,&sursa,&dest);
int i, a, b, c, j;
pNod q;
for (i = 1; i <= m; i++)
{
fgets(s,100,stdin);
j = a = b = c = 0;
while (s[j] <= '9' && s[j] >= '0') {a = a * 10 + s[j] - '0'; j++;}
j++;
while (s[j] <= '9' && s[j] >= '0') {b = b * 10 + s[j] - '0'; j++;}
j++;
while (s[j] <= '9' && s[j] >= '0') {c = c * 10 + s[j] - '0'; j++;}
q = new nod;
q -> x = b;
q -> c = c;
q -> a = v[a];
v[a] = q;
}
}
void DF(int nod, int d)
{
pNod p;
if (nod == dest) ok = 1;
if (ok)return;
for (p = v[nod]; p != NULL; p = p -> a)
if (p -> c <= d) DF(p -> x, d);
}
int caut()
{
int p = 1, u = 1000, m, i;
while (1 << i <= m) i++;
m = 1 << (i - 1);
while (p <= u)
{
ok = 0;
DF(sursa, m);
if (ok)
{
ok = 0;
DF(sursa, m - 1);
if (!ok) return m;
else
{
i = 0;
u = m - 1;
while (p + (1 << i) <= u) i++;
m = p + (1 << (i - 1));
}
}
else
{
p = m + 1;
while (p + (1 << i) <= u) i++;
m = p + (1 << (i - 1));
}
}
return 0;
}
int main()
{
citire();
printf("%d\n",caut());
return 0;
}