一、图的实现
1.图的类定义
class Graph
{
public:
int vertexnum;
int edgenum;
bool*visited;
Graph(int n){ vertexnum=n;}
~Graph();
virtual int Firstadj(int one)=0;//返回与one节点相关的第一个节点
virtual int Nextadj(int one,int pre)=0; //返回与one节点相关的pre节点之后的第一个节点
int Vernum() {return vertexnum;}
int Edgnum() {return edgenum;}
virtual int weight(int from,int to)=0;
virtual void setedge(int from,int to,int w)=0;
virtual void deledge(int from,int to)=0;
};
2.图的存储结构
(1)邻接矩阵存储
class Graphm:public Graph
{
int **Adjmatrix;
public:
Graphm(int num):Graph(num)
{
Adjmatrix=new int*[vertexnum];
for(int i=0;i<num;i++)
Adjmatrix[i]=new int[num];
for(int i=0;i<num;i++)
for(int j=0;j<num;j++)
Adjmatrix[i][j]=0;
}
~Graphm()
{
for(int i=0;i<vertexnum;i++)
delete []Adjmatrix[i];
delete[]Adjmatrix;
}
int weight(int f,int t)
{
return Adjmatrix[f][t];
}
void setedge(int f,int t,int w)
{
if(Adjmatrix[f][t]==0)
edgenum++;
Adjmatrix[f][t]=w;
}
void deledge(int f,int t)
{
if(Adjmatrix[f][t]!=0)
edgenum--;
Adjmatrix[f][t]=0;
}
int Firstadj(int one)
{
for(int i=0;i<vertexnum;i++)
{
if(Adjmatrix[one][i]!=0)
return i;
}
return -1;
}
int Nextadj(int one,int pre)
{
for(int i=pre+1;i<vertexnum;i++)
{
if(Adjmatrix[one][i]!=0)
return i;
}
return -1;
}
};
(2)邻接表存储
需要用到第一章的链表结构
struct Unit
{
int vertex;
int weight;
};
class Graphl:public Graph
{
Link<Unit>*vexlist;
public:
Graphl(int num):Graph(num){
vexlist=new Link<Unit>[num];
}
~Graphl(){ delete []vexlist;}
int weight(int f,int t)
{
Node<Unit>*h=vexlist[f].head;
while(h->next&&h->next->data.vertex!=t)
h=h->next;
return h->next->data.weight;
}
int Firstadj(int one)
{
Node<Unit>*h=vexlist[one].head;
if(h->next!=NULL)
return h->next->data.vertex;
return -1;
}
int Nextadj(int one,int pre)
{
Node<Unit>*h=vexlist[one].head;
while(h->next&&h->next->data.vertex!=pre)
h=h->next;
if(h->next==NULL)
return -1;
return h->next->data.vertex;
}
void setedge (int f,int t,int w)
{
Node<Unit>*h=vexlist[f].head;
while(h->next&&h->next->data.vertex<t)
h=h->next;
if(h->next==NULL)
{
Node<Unit>*node=new Node<Unit>*;
node->data.vertex=t;
node->data.weight=w;
node->next=NULL;
h->next=node;
edegnum++;
}
if(h->next->data.vertex==t)
{
h->next->data.weight=w;
return;
}
if(h->next->data.vertex>t)
{
Node<Unit>*node=new Node<Unit>*;
node->data.vertex=t;
node->data.weight=w;
node->next=h->next;
h->next=node;
edegnum++;
}
void deledge (int f,int t)
{
Node<Unit>*h=vexlist[f].head;
while(h->next&&h->next->data.vertex<t)
h=h->next;
if(h->next==NULL||h->next->data.vertex>t)
return -1;
if(h->next->data.vertex==t)
{
Node<Unit>*node=h->next;
h->next=node->next;
delete node;
edegnum--;
}
}
}
};
3.图的遍历
void graph_traverse(Graph&G,bool useDFS)
{
for(int i=0;i<G.Vernum();i++)
G.visited[i]=false;
for(int i=0;i<G.Vernum();i++)
{
if(G.visited[i]==false)
{
if(useDFS) DFS(G,i);
else BFS(G,i);
}
}
}
(1)深度优先
void DFS(Graph&G,int i)
{
G.visited[i]=true;
cout<<i<<'\t';
for(int w=G.Firstadj(i);w!=-1;w=G.Nextadj(i,w))
{
if(G.visited[w]==false)
DFS(G,w);
}
}
(2)广度优先
void BFS(Graph&G,int i)
{
LinkQueue<int> q;
G.visited[i]=true;
cout<<i<<'\t';
q.InQueue(i);
while(!q.IsEmpty())
{
int v=q.OutQueue();
for(int w=G.Firstadj(v);w!=-1;w=G.Nextadj(v,w))
{
if(G.visited[w]==false)
{
q.InQueue(w);
G.visited[w]=true;
cout<<w<<'\t';
}
}
}
}