Wednesday, October 31, 2012

Breadth First Search (BFS) Path Printing

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
#define siz 1000005
vector <int> vec[siz];
vector <int> path;
queue <int> q;
bool color[siz];
int cost[siz],parent[siz];
int node,edge;

void reset(){
    for(int i=0;i<=node;i++){
        color[i]=false;
        cost[i]=0;
        vec[i].clear();
    }
}

void BFS(int source, int destination){
    cost[source]=0;
    color[source]=1;
    parent[source]=source;
    q.push(source);

    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int i=0;i<vec[u].size();i++){
            int v=vec[u][i];
            if(!color[v]){
                color[v]=1;
                cost[v]=cost[u]+1;
                parent[v]=u;
                q.push(v);
            }
        }
    }
}

void pathPrint(int source, int destination){
    int n=destination;
    path.push_back(destination);
    while(true){
        if(parent[n]==source) break;
        path.push_back(parent[n]);
        n=parent[n];
    }
    path.push_back(source);
    for(int i=0;i<path.size();i++){
        if(i) printf("=>");
        printf("%d",path[i]);
    }
    path.clear();
}
int main()
{
    int u,v;
    freopen("input.txt","r",stdin);
    while(scanf("%d%d",&node,&edge)==2){
        reset();

        for(int i=0;i<edge;i++){
            scanf("%d%d",&u,&v);
            vec[u].push_back(v);
            vec[v].push_back(u);
        }

        BFS(1,node);
        pathPrint(1,node);

    }
    return 0;
}

No comments:

Post a Comment