Advertisement
pablo7890

dfs

Apr 24th, 2013
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.23 KB | None | 0 0
  1. #include <iostream>
  2. #include <ctime>
  3. #include <malloc.h>
  4. #include <cstdlib>
  5. using namespace std;
  6. struct node{
  7.     int info;
  8.     struct node *next;
  9. };
  10.  
  11. class stack{
  12.     struct node *top;
  13.     public:
  14.         stack();
  15.         void push(int);
  16.         int pop();
  17.         bool isEmpty();
  18.         void display();
  19. };
  20.  
  21. stack::stack(){
  22.     top = NULL;
  23. }
  24.  
  25. void stack::push(int data){
  26.     node *p;
  27.     if((p=(node*)malloc(sizeof(node)))==NULL){
  28.         cout<<"Memory Exhausted";
  29.         exit(0);
  30.     }
  31.     p = new node;
  32.     p->info = data;
  33.     p->next = NULL;
  34.     if(top!=NULL){
  35.         p->next = top;
  36.     }
  37.     top = p;
  38. }
  39.  
  40. int stack::pop(){
  41.     struct node *temp;
  42.     int value;
  43.     if(top==NULL){
  44.         cout<<"\nThe stack is Empty"<<endl;
  45.     }else{
  46.         temp = top;
  47.         top = top->next;
  48.         value = temp->info;
  49.         delete temp;
  50.     }
  51.     return value;
  52. }
  53.  
  54. bool stack::isEmpty(){
  55.     return (top == NULL);
  56. }
  57.  
  58. void stack::display(){
  59.     struct node *p = top;
  60.     if(top==NULL){
  61.         cout<<"\nNothing to Display\n";
  62.     }else{
  63.         cout<<"\nThe contents of Stack\n";
  64.         while(p!=NULL){
  65.             cout<<p->info<<endl;
  66.             p = p->next;
  67.         }
  68.     }
  69. }
  70.  
  71. class Graph {
  72.     private:
  73.         int n;
  74.         int **A;
  75.     public:
  76.         Graph(int size = 2);
  77.         ~Graph();
  78.         bool isConnected(int, int);
  79.         void addEdge(int x, int y);
  80.         void DFS(int , int);
  81. };
  82.  
  83. Graph::Graph(int size) {
  84.     int i, j;
  85.     if (size < 2) n = 2;
  86.     else n = size;
  87.     A = new int*[n];
  88.     for (i = 0; i < n; ++i)
  89.         A[i] = new int[n];
  90.     for (i = 0; i < n; ++i)
  91.         for (j = 0; j < n; ++j)
  92.             A[i][j] = 0;
  93. }
  94.  
  95. Graph::~Graph() {
  96.     for (int i = 0; i < n; ++i)
  97.     delete [] A[i];
  98.     delete [] A;
  99. }
  100.  
  101. bool Graph::isConnected(int x, int y) {
  102.     return (A[x-1][y-1] == 1);
  103. }
  104.  
  105. void Graph::addEdge(int x, int y) {
  106.     A[x-1][y-1] = A[y-1][x-1] = 1;
  107. }
  108.  
  109. void Graph::DFS(int x, int required){
  110.     int qq=0;
  111.     stack s;
  112.     bool *visited = new bool[n+1];
  113.     int i;
  114.     for(i = 0; i <= n; i++)
  115.         visited[i] = false;
  116.     s.push(x);
  117.     visited[x] = true;
  118.     if(x == required) return;
  119.     //cout << "Depth first Search starting from vertex ";
  120.     //cout << x << " : " << endl;
  121.     while(!s.isEmpty()){
  122.         int k = s.pop();
  123.         if(k == required) break;
  124.        // cout<<k<<" ";
  125.         for (i = n; i >= 0 ; --i)
  126.             if (isConnected(k, i) && !visited[i]) {
  127.                 s.push(i);
  128.                 visited[i] = true;
  129.                 qq++;
  130.             }
  131.     }
  132.     //cout<<endl;
  133.     cout<<qq-1;
  134.     delete [] visited;
  135. }
  136.  
  137. int main(){
  138.    
  139.     int m,n,first,last;
  140.     cin >> n >> m;
  141.     m++;   
  142.     Graph g(m);
  143.     for (int i=0; i<m-1; i++)
  144.     {
  145.         int a,b;
  146.         cin >> a >> b;
  147.         if (i==1)
  148.         {
  149.             a = first;
  150.             b = last;
  151.         }
  152.         g.addEdge(a, b);
  153.     }
  154.     g.DFS(first, last);
  155.     /*
  156.     Graph g(14);
  157.     g.addEdge(1, 2);
  158.     g.addEdge(1, 5);
  159.     g.addEdge(1, 7);
  160.     g.addEdge(1, 8);
  161.     g.addEdge(2, 3);
  162.     g.addEdge(2, 5);
  163.     g.addEdge(3, 4);
  164.     g.addEdge(5, 6);
  165.     g.addEdge(5, 7);
  166.     g.addEdge(6, 9);
  167.     g.addEdge(6, 10);
  168.     g.addEdge(7, 8);
  169.     g.addEdge(9, 10);
  170.     g.DFS(1, 2);
  171.     */
  172.     return 0;
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement