Sie sind auf Seite 1von 3

#include "graph1.

h"

graph1::graph1(int v): ver(v){


adjm = new bool*[v];
for(int i=0; i<v; i++)
adjm[i]=new bool[v];

for(int i=0; i<v; i++)


for(int j=0; j<v; j++)
adjm[i][j]=false;
}

graph1::graph1():ver(0){
}

graph1::~graph1(){
for(int i=0; i<this->ver; i++)
delete[] adjm[i];
delete[] adjm;
}

graph1::graph1(const graph1& src){


if(ver!=src.ver){
for(int i=0; i<ver; i++)
delete[] adjm[i];
delete[] adjm;

adjm=new bool*[src.ver];
for(int i=0; i<src.ver; i++)
adjm[i]=new bool[src.ver];
ver=src.ver;
}
for(int i=0; i<src.ver-1; i++)
for(int j=i+1; j<src.ver; j++)
adjm[i][j]=adjm[j][i]=src.adjm[i][j];
}

graph1& graph1::operator=(const graph1& src){


if(this==&src)return *this;
else if(ver!=src.ver){
for(int i=0; i<ver; i++)
delete[] adjm[i];
delete[] adjm;

adjm=new bool*[src.ver];
for(int i=0; i<src.ver; i++)
adjm[i]=new bool[src.ver];
ver=src.ver;
}
for(int i=0; i<src.ver-1; i++)
for(int j=i+1; j<src.ver; j++)
adjm[i][j]=adjm[j][i]=src.adjm[i][j];
for(int i=0; i<src.ver; i++)
adjm[i][i]=0;
return *this;
}

ostream &operator << (ostream &out, const graph1& src){


int v=src.get_ver();
for(int i=0; i<v; i++, out<<'\n')
for(int j=0; j<v; j++)
out<<src.get_edg(i,j)<<' ';
out<<'\n';
return out;
}

void graph1::add_edg(int x, int y){


adjm[x][y]=adjm[y][x]=true;
}

void graph1::del_edg(int x, int y){


adjm[x][y]=adjm[y][x]=false;
}

bool graph1::get_edg(int x, int y)const{


return adjm[x][y];
}

int graph1::get_ver()const{
return ver;
}

int graph1::get_grad(int x)const{


int c=0;
for(int i=0; i<ver; i++)
if(adjm[x][i])c++;
return c;
}

int* graph1::bfs_u(bool viz[], int *q, int &l, int x){


viz[x]=1;
int r=l;
q[l]=x;

while(l<=r){
int a=q[l++];
for(int i=0; i<ver; i++)
if(adjm[a][i]&&!viz[i])
q[++r]=i, viz[i]=1;
}
return q;
}

int* graph1::BFS(int x){


bool *viz=new bool[ver];
int *q=new int[ver], l=0;
for(int i=0; i<ver; i++)
viz[i]=0;

this->bfs_u(viz,q,l,x);
for(int i=0; i<ver; i++)
if(!viz[i])this->bfs_u(viz,q,l,i);
return q;
}

int* graph1::dfs_u(bool *viz, int *rez, int &i, int x){


int st[ver], l=0;
st[l++]=x;
while(l>0){
int aux=st[--l];
if(!viz[aux]){
rez[i++]=aux;
viz[aux]=1;
}

for(int j=ver-1; j>=0; j--)


if(adjm[aux][j]&&!viz[j])
st[l++]=j;
}
return rez;
}

int* graph1::DFS(int x){


bool *viz=new bool[ver];
int *rez=new int[ver], i=0;
for(int i=0; i<ver; i++)
viz[i]=0;

this->dfs_u(viz,rez,i,x);
for(int j=0; j<ver; j++)
if(!viz[j])this->dfs_u(viz,rez,i,j);
return rez;
}

Das könnte Ihnen auch gefallen