Pagini recente » Cod sursa (job #2072888) | Cod sursa (job #972158) | Cod sursa (job #1496330) | Cod sursa (job #2811242) | Cod sursa (job #69595)
Cod sursa(job #69595)
#include <cstdio>
#define input "sate.in"
#define output "sate.out"
#define MAX_N 30001
struct NOD
{
int i, c;
NOD *next;
} *L[MAX_N], *E[MAX_N], *C, *EC;
int N, M, X, Y;
int D[MAX_N], USE[MAX_N];
void READ();
void SOLVE();
void PRINT();
void ADD(NOD *&, NOD *&, int, int);
int main()
{
READ();
SOLVE();
return 0;
}
void READ()
{
FILE *f = fopen(input, "rt");
int i, a, b, c;
for(fscanf(f, "%d %d %d %d", &N, &M, &X, &Y), i=1; i<=M; ++i)
{
fscanf(f, "%d %d %d", &a, &b, &c);
ADD(L[a], E[a], b, c);
ADD(L[b], E[b], a, c);
}
fclose(f);
}
void SOLVE()
{
USE[X] = 1;
C = new NOD;
C -> i = X;
C -> next = NULL;
EC = C;
while(C)
{
NOD *g = L[C -> i];
while(g)
{
if(!USE[g -> i])
{
USE[g -> i] = 1;
if(C -> i < g -> i)
D[g -> i] = D[C -> i] + g -> c;
else
D[g -> i] = D[C -> i] - g -> c;
NOD *p = new NOD;
p -> i = g -> i;
p -> next = NULL;
EC -> next = p;
EC = p;
if(g -> i == Y)
{
PRINT();
return;
}
}
g = g -> next;
}
g = C;
C = C -> next;
delete g;
}
}
void PRINT()
{
FILE *g = fopen(output, "wt");
fprintf(g, "%d", D[Y]);
fclose(g);
}
void ADD(NOD *&L, NOD *&E, int i, int c)
{
NOD *p = new NOD;
p -> i = i;
p -> c = c;
p -> next = NULL;
if(L == NULL)
{
L = E = p;
}
else
{
E -> next = p;
E = p;
}
}