Pagini recente » Cod sursa (job #1346718) | Cod sursa (job #2299837) | Cod sursa (job #2029312) | Cod sursa (job #1730187) | Cod sursa (job #2266915)
#include <vector>
#include <queue>
#include <fstream>
using namespace std;
struct Node{
int value, distance, distanceFromSource;
};
int verticesNumber, edgeNumber, sourceNode, endNode;
Node newConnection;
vector<Node> adj[30000];
int bfs(int, int);
//void addEdge(int, int, int);
int main(){
ifstream read("sate.in");
ofstream write("sate.out");
read>>verticesNumber>>edgeNumber>>sourceNode>>endNode;
sourceNode--;
endNode--;
for(int i=0; i<edgeNumber; i++){
int x, y, d;
read>>x>>y>>d;
x--;
y--;
newConnection.value = y;
newConnection.distance = d;
adj[x].push_back(newConnection);
newConnection.value = x;
newConnection.distance = -d;
adj[y].push_back(newConnection);
}
write<<bfs(sourceNode, endNode);
return 0;
}
// void addEdge(int v, int w, int distance){
// Node newConnection;
// newConnection.value = w;
// newConnection.distance = distance;
// adj[v].push_back(newConnection);
// newConnection.value = v;
// newConnection.distance = -distance;
// adj[w].push_back(newConnection);
// }
int bfs(int sourceNodeInt, int endNode){
bool *visited = new bool[verticesNumber];
for(int i=0; i<verticesNumber; i++)
visited[i] = false;
queue<Node>Q;
Node sourceNode;
sourceNode.value = sourceNodeInt;
sourceNode.distance = 0;
sourceNode.distanceFromSource = 0;
visited[sourceNodeInt] = true;
Q.push(sourceNode);
while(!Q.empty()){
sourceNode = Q.front();
if(sourceNode.value == endNode)
return sourceNode.distanceFromSource;
Q.pop();
vector<Node>::iterator it = adj[sourceNode.value].begin();
for(; it!=adj[sourceNode.value].end(); ++it){
if(!visited[it->value]){
visited[it->value] = true;
Node newNode;
newNode.value = it->value;
newNode.distanceFromSource = sourceNode.distanceFromSource + it->distance;
newNode.distance = it->distance;
Q.push(newNode);
}
}
}
}