Pagini recente » Cod sursa (job #1548957) | Cod sursa (job #2940345) | Cod sursa (job #506047) | Solutii preONI 2008, Runda 3 | Cod sursa (job #67914)
Cod sursa(job #67914)
#include <cstdio>
#define maxn 30001
FILE *in = fopen("sate.in","r"), *out = fopen("sate.out","w");
int n, m, X, Y;
int fst;
struct graf
{
int val, dist;
graf *next;
};
graf *a[maxn] = {NULL};
void add(graf *&p, int v, int d)
{
graf *q = new graf;
q->val = v;
q->dist = d;
q->next = p;
p = q;
}
void read()
{
fscanf(in, "%d %d %d %d", &n, &m, &X, &Y);
int t1, t2, d;
for ( int i = 1; i <= m; ++i )
{
fscanf(in, "%d %d %d", &t1, &t2, &d);
if ( t1 == X )
fst = t2;
else if ( t2 == X )
fst = t1;
add(a[t1], t2, d);
add(a[t2], t1, d);
}
}
void BF(int sursa, int dest)
{
graf *p = new graf, *u = new graf;
char viz[maxn] = {0};
int v[maxn] = {0}; //v[i] == distanta pana in satul i de la sursa;
v[fst] = a[sursa]->dist;
//printf("%d\n\n", v[fst]);
p->next = NULL;
p->val = sursa;
p->dist = a[sursa]->dist;
viz[p->val] = 1;
u = p;
graf *s = new graf;
while ( p )
{
graf *q = a[p->val];
while ( q )
{
if ( !viz[q->val] )
{
viz[q->val] = 1;
graf *t = new graf;
t->next = NULL;
t->dist = q->dist;
t->val = q->val;
u->next = t;
u = t;
v[u->val] = p->val < u->val ? v[p->val] + u->dist : v[p->val] - u->dist;
//printf("%d %d %d\n", p->val, u->val, u->dist);
}
q = q->next;
}
graf *t = p;
p = p->next;
delete t;
}
fprintf(out, "%d\n", v[dest]);
}
int main()
{
read();
BF(X, Y);
return 0;
}
/*
11 7 1 11
1 7 10
4 6 4
5 7 4
6 8 5
2 10 15
4 11 13
5 8 8
1 7 10
7 5 6
5 8 14
8 6 9
6 4 5
4 11 18
*/