求无向连通图的生成树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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<<"顶点键值="< f->next=q->next; if(q==r)r=f; //与q连接的未访问的顶点入队 pe=A[q->key].first; while(pe) { if(A[pe->key].tag==0) {//入队