Advertisement
cyter

strongly_connected_components

Aug 9th, 2016
409
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.21 KB | None | 0 0
  1.     /* C++ Program to Find Strongly Connected Components in Graphs */
  2.     #include<iostream>
  3.     #include<conio.h>
  4.    
  5.     using namespace std;
  6.     struct node_info{
  7.         int no;
  8.         int lv_time, st_time;
  9.     }*q = NULL;
  10.  
  11.     struct node{
  12.         node_info *pt;
  13.         node *next;
  14.     }*top = NULL, *p = NULL, *np = NULL;
  15.  
  16.     struct node1{
  17.         node1 *link;
  18.         node_info *pt1;
  19.     }*head = NULL, *m = NULL, *n = NULL, *np1 = NULL;
  20.  
  21.     int c = 0;
  22.     void push(node_info *ptr){
  23.         np = new node;
  24.         np->pt = ptr;
  25.         np->next = NULL;
  26.         if (top == NULL){ top = np; }
  27.         else { np->next = top; top = np; }
  28.  
  29.     }
  30.  
  31.     node_info *pop(){
  32.         if (top == NULL){ cout<<"underflow\n"; }
  33.         else{
  34.             p = top;
  35.             top = top->next;
  36.             return(p->pt);
  37.             delete(p);
  38.         }
  39.     }
  40.  
  41.     void store(node_info *ptr1){
  42.         np1 = new node1;
  43.         np1->pt1 = ptr1;
  44.         np1->link = NULL;
  45.         if (c == 0){
  46.             head = np1;
  47.             m = head;
  48.             m->link = NULL;
  49.             c++;
  50.         }
  51.         else{
  52.             m = head;
  53.             np1->link = m;
  54.             head = np1;
  55.         }
  56.     }
  57.  
  58.     void remove(int x)
  59.     {
  60.         m = head;
  61.         if ((m->pt1)->no == x){
  62.             head = head->link;
  63.             delete(m);
  64.         }
  65.         else{
  66.             while ((m->pt1)->no != x && m->link != NULL){
  67.                 n = m;
  68.                 m = m->link;
  69.             }
  70.             if ((m->pt1)->no == x){
  71.                 n->link = m->link;
  72.                 delete(m);
  73.             }
  74.             else if (m->link == NULL){ cout<<"error\n"; }
  75.         }
  76.     }
  77.  
  78.     void topo(int *v, int am[][8], int i){
  79.         q = new node_info;
  80.         q->no = i;
  81.         q->st_time = c;
  82.         push(q);
  83.         v[i] = 1;
  84.         for (int j = 0; j < 8; j++){
  85.             if (am[i][j] == 0  || (am[i][j] == 1 && v[j] == 1))
  86.                 continue;
  87.             else if (am[i][j] == 1 && v[j] == 0){
  88.                 c++;
  89.                 topo(v,am,j);
  90.             }
  91.         } c++;
  92.         q = pop();
  93.         q->lv_time = c;
  94.         store(q);
  95.         return;
  96.     }
  97.  
  98.     void topo1(int *v, int am[][8], int i){
  99.         v[i] = 1;
  100.         remove(i);
  101.         cout<<i<<endl;
  102.         for (int j = 0; j < 8; j++){
  103.             if (am[i][j] == 0  || (am[i][j] == 1 && v[j] == 1)){
  104.                 continue;
  105.             }
  106.  
  107.             else if (am[i][j] == 1 && v[j] == 0){
  108.                 topo1(v,am,j);
  109.             }
  110.         }
  111.         return;
  112.     }
  113.  
  114.     int main(){
  115.  
  116.         int v[8], am[8][8], amt[8][8];
  117.         for (int i = 0; i < 8; i++)
  118.             v[i] = 0;
  119.         for (int i = 0; i < 8; i++){
  120.             cout<<"enter the values for adjacency matrix row:"<<i + 1<<endl;
  121.             for (int j = 0; j < 8; j++){
  122.                 cin>>am[i][j];
  123.             }
  124.         }
  125.  
  126.         topo(v, am, 0);
  127.         for (int i = 0; i < 8; i++){
  128.             v[i] = 0;
  129.             for (int j = 0; j < 8; j++)
  130.                 amt[j][i] = am[i][j];
  131.  
  132.         }
  133.  
  134.         while (head != NULL){
  135.             cout<<"Strongly Connected Components:\n";
  136.                 topo1(v, amt, (head->pt1)->no);
  137.  
  138.         }
  139.         getch();
  140.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement