Pagini recente » Cod sursa (job #2729874) | Cod sursa (job #2455949) | Cod sursa (job #1040989) | Cod sursa (job #1689059) | Cod sursa (job #1370503)
#include <queue>
#include <vector>
#include <fstream>
using namespace std;
struct Edge
{
int x, dist;
Edge(int x, int dist) : x(x), dist(dist) {};
};
void write(int n)
{
ofstream f("sate.out");
f << n;
f.close();
}
void read(vector<Edge*>* &nodes, int &n, int &start, int &end)
{
ifstream f("sate.in");
int x, y, dist, m;
f >> n >> m >> start >> end;
nodes = new vector<Edge*>[n+1];
for (int i = 0; i < m; ++i)
{
f >> x >> y >> dist;
nodes[x].push_back(new Edge(y, dist));
nodes[y].push_back(new Edge(x, dist));
}
f.close();
}
int findDist(vector<Edge*> nodes[], int n, int start, int end)
{
queue<int> Q;
bool visited[n+1];
int dist[n+1], node;
for (int i = 0; i < n+1; ++i) visited[i] = false;
dist[start] = 0;
visited[start] = true;
Q.push(start);
node = start;
while (!Q.empty() && node != end)
{
node = Q.front();
Q.pop();
for (vector<Edge*>::iterator i = nodes[node].begin(); i != nodes[node].end(); ++i)
{
if (!visited[(*i)->x])
{
Q.push((*i)->x);
if (node < (*i)->x)
dist[(*i)->x] = dist[node] + (*i)->dist;
else
dist[(*i)->x] = dist[node] - (*i)->dist;
visited[(*i)->x] = true;
}
}
}
return dist[end];
}
int main()
{
vector<Edge*> *nodes;
int n, x, y;
read(nodes, n, x, y);
write(findDist(nodes, n, x, y));
return 0;
}