数据结构与算法(第四章-1)

一、图的实现

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';
			}
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值