Pagini recente » Cod sursa (job #707772) | Cod sursa (job #3192837) | Cod sursa (job #756718) | Cod sursa (job #2240773) | Cod sursa (job #67918)
Cod sursa(job #67918)
#include <cstdio>
#define maxn 30001
FILE *in = fopen("sate.in","r"), *out = fopen("sate.out","w");
int n, m, X, Y;
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);
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;
p->next = NULL;
p->val = sursa;
p->dist = a[sursa]->dist;
viz[p->val] = 1;
u = p;
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;
if ( u->val == dest )
{
fprintf(out, "%d\n", v[dest]);
return;
}
}
q = q->next;
}
graf *t = p;
p = p->next;
delete t;
}
}
int main()
{
read();
BF(X, Y);
return 0;
}