Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <queue>
- #include <vector>
- #include <stack>
- #define infi 0x7fffffff
- using namespace std;
- typedef pair<int,int> arco;
- //priority_queue< int, vector<int>, greater<int> > pq1;
- int min_camino(vector< vector<arco> > G, int x, int y, vector<int> &cami){
- vector<bool> b(G.size(),false);
- vector<int> p(G.size(),infi);
- priority_queue< arco, vector<arco>, greater<arco> > Q;
- p[x] = 0;
- Q.push( arco(0,x) );
- int v;
- bool primer = true;
- while (not Q.empty()){
- primer = true;
- int vertex = Q.top().second;
- v = vertex;
- Q.pop();
- if (not b[vertex]){
- b[vertex] = true;
- int tam = G[vertex].size();
- for (int i = 0; i < tam; ++i){
- int adyacente = G[vertex][i].second;
- int peso = G[vertex][i].first;
- if( (p[vertex]+peso) < p[adyacente] ){
- p[adyacente] = p[vertex]+peso;
- cami[adyacente] = vertex;
- Q.push(arco(p[adyacente],adyacente));
- }
- }
- }
- }
- return p[y];
- }
- int main() {
- int n,m,u,v,w,x,y;
- while(cin >> n >> m){
- vector< vector<arco> > G(n,vector<arco>() );
- for(int i=0;i<m;++i){
- cin >> u >> v >> w;
- G[u].push_back( arco(w,v) ); //PRIMER VALOR: PESO || SEGUNDO VALOR: VERTICE ADYACENTE
- }
- cin >> x >> y;
- vector<int> c(n, -1);
- int r = min_camino(G,x,y,c);
- if( r!= infi ){
- cout << x;
- stack<int> path;
- int start = y;
- while(c[start]!=-1){
- path.push(start);
- start = c[start];
- }
- while(not path.empty() ){
- cout << ' ' << path.top();
- path.pop();
- }
- }
- else cout << "no path from " << x << " to " << y;
- cout << endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement