Cod sursa(job #2266915)

Utilizator FilpTeodorFilp Teodor FilpTeodor Data 22 octombrie 2018 22:41:03
Problema Sate Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#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);
			}
		}
	}
 
}