Pagini recente » Cod sursa (job #603489) | Cod sursa (job #1878098) | Cod sursa (job #1559247) | Cod sursa (job #2705129) | Cod sursa (job #2262816)
#include <stdio.h>
#include <stdbool.h>
#define MAX_NODES 30001
#define MAX_EDGES 100025
struct edge_t {
int node;
int value;
int next;
} edges[MAX_EDGES];
int graph[MAX_NODES], edge_it = 1, dis[MAX_NODES];
void add_edge(int x, int y, int value)
{
struct edge_t edge = {y, value, graph[x]};
edges[edge_it] = edge;
graph[x] = edge_it++;
}
void bfs(int start, int end)
{
int q[MAX_NODES], q_push = 0, q_pop = 0;
bool vis[MAX_NODES] = {};
q[q_push++] = start;
vis[start] = true;
while (q_pop < q_push) {
int node = q[q_pop++];
struct edge_t edge = edges[graph[node]];
while (edge.node) {
if (!vis[edge.node]) {
q[q_push++] = edge.node;
vis[edge.node] = true;
dis[edge.node] = dis[node] + (node < edge.node ? edge.value : (-edge.value));
if (edge.node == end)
break;
}
edge = edges[edge.next];
}
if (edge.node == end)
break;
}
}
int main()
{
int n, m, x, y;
freopen("sate.in", "r", stdin);
freopen("sate.out", "w", stdout);
scanf("%d %d %d %d", &n, &m, &x, &y);
while (m--) {
int x, y, v;
scanf("%d %d %d", &x, &y, &v);
add_edge(x, y, v);
add_edge(y, x, v);
}
bfs(x, y);
printf("%d", dis[y] > 0 ? dis[y] : (-dis[y]));
return 0;
}