求无向连通图的生成树

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

求无向连通图的生成树

一、实验目的

⑴掌握图的逻辑结构

⑵掌握图的邻接矩阵存储结构

⑶验证图的邻接矩阵存储及其遍历操作的实现

二、实验内容

(1)建立无向图的邻接矩阵存储

(2)对建立的无向图,进行深度优先遍历

(3)对建立的无向图进行广度优先遍历

三、设计与编码

(1)本实验用到的理论知识

(2)算法设计

(3)编码

// 图抽象类型及其实现.cpp : Defines the entry point for the console application.

//

#include"stdafx.h"

#include"Graph.h"

#include"iostream.h"

int Graph::Find(int key,int &k)

{

int flag=0;

for(int i=0;i

if(A[i].data.key==key){k=i;flag=1;break;};

return flag;

};

int Graph::CreateGraph(int vertexnum,Edge *E,int edgenum) { //由边的集合E(E[0]~E[VertexNum-1]),生成该图的邻接表表示

if(vertexnum<1)return(-1);//参数vertexnum非法

int i,front,rear,k;

Enode *q;

//先生成不带边表的顶点表--即顶点为孤立顶点集

A=new Vnode[vertexnum];

if(!A)return(0);//堆耗尽

for(i=0;i

{

A[i].data.key=i;

A[i].tag=0;

A[i].data.InDegree=A[i].data.OutDegree=A[i].tag=0;

A[i].first=0;

};

VertexLen=vertexnum;

//在生成边表

if(edgenum<0)return(1);//无边的图

for(i=0;i

{

front=E[i].Head;rear=E[i].Tail;

if(!Find(rear,k) || !Find(front,k))return(-2);//参数E非法

q=new Enode;

if(!q)return(0);

q->key=front;

q->Weight=E[i].weight;

q->next=A[rear].first;

A[rear].first=q;

A[rear].data.OutDegree++;

A[front].data.InDegree++;

if(Type>2)

{

q=new Enode;

if(!q)return(0);

q->key=rear;

q->next=A[front].first;

A[front].first=q;

q->Weight=E[i].weight;

};

};

return(1);

};

void Graph::Dfs(int key,int &flag)

{

//static run=1;

Enode *w;

A[key].tag=flag;

if(Type>2)cout<<"连通分量="<

cout<<"顶点键值="<

for(w=A[key].first;w ;w=w->next)

if(!A[w->key].tag)Dfs(w->key,flag);

};

int Graph::DfsDravers(int v0) //从指定顶点深度遍历

{

int i,k,componentnum=1;

//if(Type<3)return(-1);//不考虑由向图

//cout<<"begain....\n";

if(!(Find(v0,k))){cout<<"find=="<

if(Type>2)cout<<"---连通分量"<

Dfs(k,componentnum);

componentnum++;

for(i=0;i

{

if(!A[i].tag){

if(Type>2)cout<<"---连通分量

"<

Dfs(i,componentnum);componentnum++;

};

};

return(componentnum-1);

};

int Graph::Bfs()

{

int i,comp=1; //comp=连通分量的标记,、、...

struct queue{int key;queue * next;};

Enode *pe;

queue *f,*r,*q,*p=new queue;

if(!p)return(-1); //堆耗尽

p->next=0;f=r=p; //生成空队列

for(i=0;i

for(i=0;i

{

if(A[i].tag==0)

{

A[i].tag=comp;

//入队该顶点的key

p=new queue;

if(!p)return(-1);

p->key=A[i].data.key;

p->next=0;

f->next=p;r=p;

while(f->next)//当队非空时

{//出队一顶点

q=f->next;

if(Type>2)cout<<"连通分量"<

cout<<"顶点键值="<key<

f->next=q->next;

if(q==r)r=f; //与q连接的未访问的顶点入队

pe=A[q->key].first;

while(pe)

{

if(A[pe->key].tag==0)

{//入队

相关文档
最新文档