#include <bits/stdc++.h>
#define INF INT_MAX
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
using namespace std;
void tree(vector<int> prufer,int n){
//For Tracking the prufer code as well as node's visit
vector<bool>check(n,true),visit(n,true);
//All the nodes in graphs
vector<int> nodes(n);
for(int i=0; i<n; i++){
nodes[i]=i+1;
if(i<n-2)
check[prufer[i]-1]=false;
}
//Nested loop to make edge between prufer and nodes
for(int i=0; i<prufer.size(); i++){
for(int j=0; j<n; j++){
//if smallest label node not in prufer is matched
then remove both (i.e. x->y x from prufer and y from
nodes)
if(check[j]){
//(Note here we are not removing but marking
it visit true)
cout<< prufer[i] << " --- " << nodes[j];
visit[j]=false;
check[j]=false;
break;
}
}cout<<'\n';
}
//For Remaining two nodes
for(int i=0; i<n ;i++){
//if remaining node is in Prufer
if(visit[i]){
for(int j=i+1; j<n; j++){
// If remaining nodes in Nodes
if( visit[j]){
cout<<nodes[i] << " --- " << nodes[j];
break;
}
}
break;
}
}
cout<<'\n';
}
//---------------------------Generate all possible codes------
----------------//
void generate(int index,int n,vector<vector<int>>
&ans,vector<int> &prufer){
//-------------------Base condition-------------//
if(index==n-2){
ans.push_back(prufer);
return;
}
//-----------Increment index for every child----//
for (int i = 1; i <= n; i++)
{
prufer[index]=i;
generate(index+1,n,ans,prufer);
}
}
//-----------------Main Driver function----------------------
//
int main()
{
int n,x;
string pt="--------------------\n";
cout<<pt<<"Please enter the number of vertices in
complete graph : ";
cin>>n;
cout<<"Total number of spanning tree = n^(n-2) =
"<<pow(n,n-2)<<endl;
//--------------All possible prufer codes----------//
vector<vector<int>> prufers;
vector<int> prufer(n-2,0);
cout<<pt;
generate(0,n,prufers,prufer);
//============Print all Spanning
Tree==============//
for (int i = 0; i < prufers.size(); i++)
{
cout<<pt<<"Spanning Tree_"<<i+1<<"\n"<<pt;
tree(prufers[i],n);
}
return 0;
}
Comments
Post a Comment