Pagini recente » Cod sursa (job #2561209) | Cod sursa (job #1312241) | Cod sursa (job #3188074) | Cod sursa (job #526757) | Cod sursa (job #3754)
Cod sursa(job #3754)
#include <fstream>
using namespace std;
#define in "pscnv.in"
#define out "pscnv.out"
#define NMAX 25010
#define INF 3000001
#define ALB 0
#define GRI 1
#define NEGRU 2
typedef long int LI;
typedef struct nod {
LI vf;
LI cost;
nod* next;
} *PNOD, NOD;
PNOD L[NMAX];
LI n, nod_p, nod_s, d[NMAX], color[NMAX], q[NMAX], m;
LI prim, ultim;
int BF(LI,LI);
void Read();
void Add(LI,LI,LI);
void Cautare(LI,LI);
FILE *fout = fopen( out, "w" );
LI minim, suma;
int main()
{
Read();
minim = INF;
Cautare(0, suma);
fprintf( fout, "%ld\n", minim );
fclose( fout );
return 0;
}
void Read()
{
FILE *fin = fopen( in, "r" );
fscanf( fin, "%ld%ld%ld%ld", &n, &m, &nod_p, &nod_s );
LI v1, v2, cost;
LI i;
for ( i = 1; i <= m; ++i )
{
fscanf( fin, "%ld%ld%ld", &v1, &v2, &cost );
Add(v1,v2,cost);
suma += cost;
d[v1] = d[v2] = INF;
}
fclose( fin );
}
void Add(LI i, LI j, LI cost )
{
PNOD p = new NOD;
p->vf = j;
p->cost = cost;
p->next = L[i];
L[i] = p;
}
int BF( LI nod, LI limita )
{
PNOD j;
LI i;
for ( i = 1; i <= n; ++i )
{
d[i] = INF;
color[i] = ALB;
}
d[nod] = 0;
color[nod] = GRI;
prim = ultim = 1;
q[ultim] = nod;
while ( prim <= ultim )
{
i = q[prim];//extrag capul cozii
for ( j = L[i]; j; j = j->next )
if ( color[j->vf] != NEGRU && j->cost <= limita )
{
color[j->vf] = GRI;
ultim++;
q[ultim] = j->vf;
d[j->vf] = d[i] + 1;
if ( j->vf == nod_s ) return 1;
}
prim++;
color[i] = NEGRU;
}
return 0;
}
void Cautare( LI st, LI dr )
{
LI mijl = (st+dr )>>1;
if ( dr < minim )
{
minim = dr;
}
else return;
if ( BF ( nod_p, mijl ) ) Cautare( st, mijl );
else Cautare( mijl+1, dr );
}