Pagini recente » Cod sursa (job #2565991) | Cod sursa (job #511725) | Cod sursa (job #2521045) | Cod sursa (job #3216971) | Cod sursa (job #1370513)
#include <queue>
#include <list>
#include <fstream>
using namespace std;
struct Edge
{
int x, dist;
Edge(int x, int dist) : x(x), dist(dist) {};
};
void read(list<Edge*>* &nodes, int &n, int &start, int &end)
{
ifstream f("sate.in");
int x, y, dist, m;
f >> n >> m >> start >> end;
nodes = new list<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(list<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 (list<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;
}
}
}
ofstream f("sate.out");
f << dist[end];
f.close();
}
int main()
{
list<Edge*> *nodes;
int n, x, y;
read(nodes, n, x, y);
findDist(nodes, n, x, y);
return 0;
}