Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: KINGARZA en 8 Noviembre 2016, 03:27 am



Título: Grafos: camino mas corto entre dos nodos[c++]
Publicado por: KINGARZA en 8 Noviembre 2016, 03:27 am
Dados dos nodos A y V de un grafo, quiero encontrar el camino  (el mas corto) que empiece en A y culmine en V

POR EJEMPLO :

(https://upload.wikimedia.org/wikipedia/commons/thumb/8/86/6n-graf-clique.svg/350px-6n-graf-clique.svg.png)

queremos iniciar en el nodo 1 y finalizar en el nodo 3

Entrada:
Dame numero de enlaces: 6
6 4
4 3
4 5
5 1
3 2
2 5
Dame nodo raiz: 1
Dame nodo fin: 3

Salida: 1 5 4 3

Error, lo optimo es: 1, 2, 3

Lo que intente primero fue recorrer a profundidad con recursion, luego con la cola (como el recorrido es por niveles crei que el recorrido seria optimo, pero no)pero ninguno me funciona, me han comentado que puedo hacerlo con backtracking, pero aun no entiendo muy bien esa tecnica y pues si pueden ayudarme, adelante.

Mi codigo
Código
  1. #include<bits/stdc++.h>
  2. #define MAX 1000002
  3. using namespace std;
  4.  
  5. vector<int>ady[MAX];
  6. bool visitado[MAX];
  7. int path[MAX];
  8. int N;
  9.  
  10. //recorrido con recursion
  11. void DFS(int u, int fin){
  12.    path[N++] = u;
  13.    visitado[u] = true;
  14.    for(int v = 0; v < ady[u].size(); ++v)
  15.        if(ady[u][v] == fin){
  16.            path[N++] = fin;
  17.            for(int i = 0; i < N; i++)
  18.                cout<<path[i]<<" ";
  19.            exit(0);
  20.        }
  21.        else if(!visitado[ady[u][v]])
  22.            DFS(ady[u][v], fin);
  23. }
  24.  
  25. //recorrido con cola
  26. void DFS_cola(int u, int fin){
  27.    queue<int>cola;
  28.    cola.push(u);
  29.    while(!cola.empty()){
  30.        int tope = cola.front();
  31.        visitado[tope] = true;
  32.        path[N++] = tope;
  33.        cola.pop();
  34.        for(int v = 0; v < ady[tope].size(); ++v)
  35.            if(ady[tope][v] == fin){
  36.                path[N++] = fin;
  37.                for(int i = 0; i < N; i++)
  38.                    cout<<path[i]<<" ";
  39.                exit(0);
  40.            }
  41.            else if(!visitado[ady[tope][v]])
  42.                cola.push(ady[tope][v]);
  43.    }
  44.  
  45. }
  46.  
  47. int main(){
  48.  
  49.    int n, a, b, m(0);
  50.    cout<<"Dame numero de enlaces: ";
  51.    cin>>n;
  52.  
  53.    for(int i = 0; i < n; i++){
  54.        cin>>a>>b;
  55.        ady[a].push_back(b);
  56.        ady[b].push_back(a);
  57.    }
  58.    int inicial, fin;
  59.    cout<<"Dame nodo raiz: ";
  60.    cin>>inicial;
  61.    cout<<"Dame nodo fin: ";
  62.    cin>>fin;
  63.    //DFS(inicial, fin);
  64.    DFS_cola(inicial, fin);
  65.    return 0;
  66. }


Título: Re: Grafos: camino mas corto entre dos nodos[c++]
Publicado por: MAFUS en 8 Noviembre 2016, 09:22 am
En tu ejemplo te faltó el camino 1 - 2 por definir, por eso programa no podía verlo y te dio 1 - 5 - 4 - 3


Título: Re: Grafos: camino mas corto entre dos nodos[c++]
Publicado por: KINGARZA en 9 Noviembre 2016, 20:38 pm
Gracias por contestar, ya intente eso que me comentas y aun asi me da el mismo resultado
 :-[.