Pagini recente » Cod sursa (job #2804695) | Cod sursa (job #340909) | Cod sursa (job #2152522) | Cod sursa (job #2711304) | Cod sursa (job #2858000)
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
struct Edge {
int node, cost;
};
#define MAX_N 30000
#define INF 1e9
int noNodes;
vector<Edge> graph[MAX_N];
queue<int> bfQueue;
bool marked[MAX_N];
int dist[MAX_N];
void addEdge(int a, int b, int cost) {
graph[a].push_back({b, cost});
graph[b].push_back({a, -cost});
}
void bf(int node) {
int i;
for (i = 0; i < noNodes; ++i)
dist[i] = INF;
dist[node] = 0;
bfQueue.push(node);
marked[node] = true;
while (!bfQueue.empty()) {
node = bfQueue.front();
for (const Edge& edge : graph[node])
if (dist[edge.node] > dist[node] + edge.cost) {
dist[edge.node] = dist[node] + edge.cost;
if (!marked[edge.node]) {
bfQueue.push(edge.node);
marked[node] = true;
}
}
bfQueue.pop();
}
}
int main() {
FILE *fin, *fout;
fin = fopen("sate.in", "r");
fout = fopen("sate.out", "w");
int m, x, y, a, b, c;
fscanf(fin, "%d%d%d%d", &noNodes, &m, &x, &y);
--x, --y;
while (m--) {
fscanf(fin, "%d%d%d", &a, &b, &c);
addEdge(--a, --b, c);
}
bf(x);
fprintf(fout, "%d\n", dist[y]);
fclose(fin);
fclose(fout);
return 0;
}