Professional Documents
Culture Documents
105
}
friend int* getvertices(vertex *v,int i,int *all)
{
if(v)
{
all[i]=v->data;
all=getvertices(v->next,i+1,all);
}
else
return all;
}
friend class graph;
};
class graph
{
vertex **v;
int nv;
int **cost;
bool *visitedDFT,*visitedBFT;
public:
graph(int n)
{
nv=n;
106
visitedDFT=new bool[n];
visitedBFT=new bool[n];
v=new vertex*[n];
cost=new int*[n];
for(int i=0;i<n;i++)
{
v[i]=new vertex[n];
cost[i]=new int[n];
visitedDFT[i]=0;
visitedBFT[i]=0;
}
}
void creategraph(int **m)
{
for(int i=0;i<nv;i++)
for(int j=0;j<nv;j++)
{
if(m[i][j]==1)
{
v[i]->next=new vertex(j,v[i]->next);
}
}
}
107
void creategraph()
{
int c;
cout<<"Enter the edges one by one with cost:\n";
while(1)
{
int head,tail;
cin>>head>>tail>>c;
if(head>=nv||tail>=nv)
break;
v[head]->next=new vertex(tail,v[head]->next);
cost[head][tail]=c;
}
}
void displaygraph()
{
for(int i=0;i<nv;i++)
{
cout<<"["<<i<<"]\t";
vertex *temp=v[i]->next;
while(temp)
{
cout<<temp->data<<"\t"<<"cost[";
108
temp=temp->next;
}
cout<<endl;
}
}
friend void DFT(graph g,int v1)
{
cout<<v1<<"\t";
g.visitedDFT[v1]=1;
int ct=countnode(g.v[v1]);
int *array=new int[ct];
array=getvertices(g.v[v1],0,array);
for(int i=0;i<ct;i++)
if(!g.visitedDFT[array[i]])
DFT(g,array[i]);
}
friend void BFT(graph g,int v1)
{
int q[100],front=0,rear=0;
q[++rear]=v1;
while(front!=rear)
{
int curr=q[++front];
109
if(!g.visitedBFT[curr])
cout<<curr<<"\t";
g.visitedBFT[curr]=1;
int ct=countnode(g.v[curr]);
int *array=new int[ct];
array=getvertices(g.v[curr],0,array);
for(int i=0;i<ct;i++)
{
if(!g.visitedBFT[array[i]])
q[++rear]=array[i];
}
}
}
// friend class node;
};
int main()
{
int n;
cout<<"Enter the number of vertices:\n";
cin>>n;
graph g(n);
g.creategraph();
cout<<"\nDFT\n";
110
DFT(g,0);
cout<<"\nBFT\n";
BFT(g,0);
cout<<"\n";
return 1;
}
Output:
Enter the number of vertices:
7
Enter the edges one by one with cost:
013
025
037
103
121
156
205
211
234
249
258
307
324
111
348
429
438
457
516
528
547
562
652
777
DFT
0
BFT
0
//Kruskal algorithm:
#include<iostream>
using namespace std;
class vertex
{
public:
int data,mark;
vertex *next;
112
113
};
class graph
{
vertex **v;
int nv;
bool *visitedDFT,*visitedBFT;
public:
graph(int n)
{
nv=n;
visitedDFT=new bool[n];
visitedBFT=new bool[n];
v=new vertex*[n];
for(int i=0;i<n;i++)
{
v[i]=new vertex[n];
visitedDFT[i]=0;
visitedBFT[i]=0;
}
}
void creategraph()
{
cout<<"Enter the edges one by one:\n";
114
while(1)
{
int head,tail;
cin>>head>>tail;
if(head>=nv||tail>=nv)
break;
v[head]->next=new vertex(tail,v[head]->next);
}
}
void displaygraph()
{
for(int i=0;i<nv;i++)
{
cout<<"["<<i<<"]\t";
vertex *temp=v[i]->next;
while(temp)
{
cout<<temp->data<<"\t";
temp=temp->next;
}
cout<<endl;
}
}
115
116
temp->next=new vertex(mintail,temp->next);
mygraph[minhead][mintail]=10;
mygraph[mintail][minhead]=10;
return kruskal(g,mygraph,n);
}
else
{
mygraph[minhead][mintail]=20;
mygraph[mintail][minhead]=20;
return kruskal(g,mygraph,n);
}
}
int closed(int minhead,int mintail,int **mygraph,int n)
{
v[mintail]->mark=1;
if(minhead==mintail) return 1;//{cout<<"Loop formed\n";
return 1;}
int arr[n],ii=0;
for(int i=0;i<n;i++)
if(mygraph[mintail][i]==10)
{
arr[ii]=i;//cout<<"\narray "<<ii<<"th value "<<arr[ii]<<'\n';
ii++;
117
}
arr[ii]=-1;ii=0;
/* cout<<"connected with "<<mintail<<"\n";
for(int i=0;arr[i]>=0;i++)
cout<<arr[i]<<"\t";
cout<<"\n";*/
for(int i=0;arr[i]>=0;i++)
{
if(!v[arr[i]]->mark)
ii=closed(minhead,arr[i],mygraph,n);
if(ii==1)
return ii;
}
return 0;//cout<<"No loop\n"; return 0;
}
};
int main()
{
int n;
cout<<"Enter the number of vertices:\n";
cin>>n;
int **mygraph;
mygraph=new int*[n];
118
for(int i=0;i<n;i++)
mygraph[i]=new int[n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
mygraph[i][j]=0;
cout<<"Enter the edge and weight one by one:\n";
while(1)
{
int tail,head,weight;
cin>>head>>tail>>weight;
if(tail>=n||head>=n)
break;
if(head==tail)
cout<<"Invalid edge\nEnter again\n";
else
mygraph[head][tail]=weight;
}
cout<<"The Adjacency matrix is:\n";
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cout<<mygraph[i][j]<<"\t";
cout<<"\n";
119
}
graph g(n);
kruskal(g,mygraph,n);
g.displaygraph();
return 1;
}
Output:
Enter the number of vertices:
7
Enter the edge and weight one by one:
013
025
037
103
121
156
205
211
234
249
258
307
324
120
348
429
438
457
516
528
547
562
652
777
The Adjacency matrix is:
0
[0]
[1]
[2]
[3]
[4]
121
[5]
[6]
//Prims algorithm:
#include<iostream>
using namespace std;
class vertex
{
public:
int data,mark;
vertex *next;
vertex(int val=0,vertex *n=NULL)
{
data=val;
next=n;
mark=0;
}
};
class graph
{
vertex **v;
int nv;
bool *visitedDFT,*visitedBFT;
public:
122
graph(int n)
{
nv=n;
visitedDFT=new bool[n];
visitedBFT=new bool[n];
v=new vertex*[n];
for(int i=0;i<n;i++)
{
v[i]=new vertex[n];
visitedDFT[i]=0;
visitedBFT[i]=0;
}
}
void displaygraph()
{
for(int i=0;i<nv;i++)
{
cout<<"["<<i<<"]\t";
vertex *temp=v[i]->next;
while(temp)
{
cout<<temp->data<<"\t";
temp=temp->next;
123
}
cout<<endl;
}
}
friend void prim(graph &g,int **mygraph,int v1,int n,int ct)
{
if(ct==n-1)
return;
int head=0,tail=0,min=10;
g.v[v1]->mark=1;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(g.v[i]->mark && mygraph[i][j] && mygraph[i][j]<min)
{
head=i;
tail=j;
min=mygraph[i][j];
}
}
mygraph[head][tail]=10;
mygraph[tail][head]=10;
if(g.v[tail]->mark)
124
return prim(g,mygraph,head,n,ct);
else
{
g.v[head]->next=new vertex(tail,g.v[head]->next);
return prim(g,mygraph,tail,n,ct+1);
}
}
};
int main()
{
int n;
cout<<"Enter the number of vertices:\n";
cin>>n;
int **mygraph;
mygraph=new int*[n];
for(int i=0;i<n;i++)
mygraph[i]=new int[n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
mygraph[i][j]=0;
cout<<"Enter the edge and weight one by one:\n";
while(1)
{
125
int tail,head,weight;
cin>>head>>tail>>weight;
if(tail>=n||head>=n)
break;
if(head==tail)
cout<<"Invalid edge\nEnter again\n";
else
mygraph[head][tail]=weight;
}
cout<<"The Adjacency matrix is:\n";
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cout<<mygraph[i][j]<<"\t";
cout<<"\n";
}
graph g(n);
prim(g,mygraph,0,n,0);
g.displaygraph();
return 1;
}
Output:
Enter the number of vertices:
126
7
Enter the edge and weight one by one:
013
025
037
103
121
156
205
211
234
249
258
307
324
348
429
438
457
516
528
547
562
127
652
777
The Adjacency matrix is:
0
[0]
[1]
[2]
[3]
[4]
[5]
[6]