Tuesday, April 19, 2011

Floyd Warshall - Shortest Path Algorithm in C++

Another version of Shortest Path Algorithm in C++. It is a graph analysis algorithm for finding shortest paths in a weighted graph (with positive or negative edge weights). A single execution of the algorithm will find the lengths (summed weights) of the shortest paths between all pairs of vertices though it does not return details of the paths themselves. The algorithm is an example of dynamic programming.



#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
class path
{
    int n;
        int p[10][10];
        int a[10][10];
        int c[10][10];
    public:
        void get();
        void pm();
        void ap();
        void disp();
};
void path::get()
{
    int i,j,k;
    clrscr();
    cout<<"Enter the no. of nodes in the graph :";
    cin>>n;
    cout<<"
Enter the adjacency matrix :
";
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            //    cout<<"a["<<i<<","<<j<<"] = ";
            cin>>a[i][j];
            p[i][j]=0;
        }
    }
    cout<<"

Enter The cost matrix is :

";
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
           //    cout<<"a["<<i<<","<<j<<"] = ";
            cin>>c[i][j];
        }
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {

                p[i][j]=a[i][j];

        }
    }
}
void path::disp()
{
//    cout<<"

 The output matrix for the given graph is :
";
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cout<<p[i][j]<< "    ";
        }
        cout<<endl;
}
}

void path::pm()
{
    int i,j,k;

    for(k=1;k<=n;k++)
    {
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                p[i][j]=p[i][j] || p[i][k] && p[k][j];
            }
        }
    }

}
void path::ap()
{
    int i,j,k;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {

                p[i][j]=c[i][j];

        }
    }
    for(k=1;k<=n;k++)
    {
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                if(p[i][j]<p[i][k]+p[k][j])
                {
                    p[i][j]=p[i][j];
                }
                else
                {
                p[i][j]=p[i][k]+p[k][j];
                }
            }
        }
    }
}
void main()
{
path p;
p.get();
p.pm();
cout<<"path matrix is :
";
p.disp();
getch();
p.ap();
cout<<"all pair shortest  path matrix is :
";
p.disp();
getch();
}