Program:
/*
Warshall's Algorithm
*/
#include<iostream>
using namespace std;
class Graph
{
int g[20][20];
int n;
int start,dir,weighted;
public:
Graph()
{
cout<<"\n Enter number of vertices:";
cin>>n;
cout<<"\n Enter start vertex:";
cin>>start;
cout<<"\n Enter 0-UnDirected 1-Directed:";
cin>>dir;
cout<<"\n Enter 0-Non-Weighted 1-Weighted:";
cin>>weighted;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
g[i][j] = 0;
}
}
}
void readGraphByEdges();
void showGraphByMatrix();
void insert(int u,int v,int w);
void warshall();
};
void Graph::readGraphByEdges()
{
cout<<"\n Enter Edges of the Graph: ";
int u,v,w;
while(1)
{
if(weighted == 1)
{
cout<<"\n Enter u,v,w -1 to Stop:";
cin>>u>>v>>w;
if(u == -1 || v == -1 || w == -1)
{
break;
}
insert(u,v,w);
}
else
{
cout<<"\n Enter u,v -1 to Stop:";
cin>>u>>v;
if(u == -1 || v == -1 )
{
break;
}
insert(u,v,1);
}
}
}
void Graph::insert(int u,int v,int w = 1)
{
if(dir == 0)
{
g[u][v] = w;
g[v][u] = w;
}
else
{
g[u][v] = w;
}
}
void Graph::showGraphByMatrix()
{
cout<<"\n\n Displaying Graph by Matrix:";
for(int i=0;i<n;i++)
{
cout<<endl;
for(int j=0;j<n;j++)
{
cout<<g[i][j]<<" ";
}
}
cout<<"\n\n";
}
void Graph::warshall()
{
cout<<"\n Warshall Algorithm";
// transitive closure
int tc[20][20];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(g[i][j] != 0)
{
tc[i][j] = 1;
}
else
{
tc[i][j] = 0;
}
}
}
for(int k=0;k<n;k++)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if( tc[i][k] != 0 && tc[k][j] != 0)
{
tc[i][j] = 1;
}
}
}
}
cout<<"\n\n Transitive Closure:";
for(int i=0;i<n;i++)
{
cout<<endl;
for(int j=0;j<n;j++)
{
cout<<tc[i][j]<<" ";
}
}
}
int main()
{
freopen("inputGraph.txt","r",stdin);
Graph g;
g.readGraphByEdges();
g.showGraphByMatrix();
g.warshall();
return 0;
}
Input File:
7 0 1 0 0 2 2 1 0 5 5 4 4 6 6 3 -1 -1
Output:

