有向图的强连通分量

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

实验报告

课程名称数据结构

实验项目名称有向图的强连通分量

班级与班级代码14计算机实验班

实验室名称(或课室)实验楼803 专业计算机科学与技术

任课教师

学号:

姓名:

实验日期:2015年12 月03 日

广东财经大学教务处制

姓名实验报告成绩

评语:

指导教师(签名)

年月日说明:指导教师评分后,实验报告交院(系)办公室保存。

一、实验目的与要求

采用邻接表存储的有向图。

二、实验内容

(1)创建N个节点的空图

DiGraph CreateGraph(int NumVertex)//创建一个N个节点的空图

{

DiGraph G;

G = malloc( sizeof( struct Graph ) );

if( G == NULL ) FatalError( "Out of space!!!" );

G->Table = malloc( sizeof( struct TableEntry ) * NumVertex );

if( G->Table == NULL )

FatalError( "Out of space!!!" );

G->NumVertex = NumVertex;

G->NumEdge = 0;

int i;

for (i=0;i

{

G->Table[i].Header=MakeEmpty(NULL);

G->Table[i].V=i;

}

return G;

}

(2)在图G上执行DFS,通过对DFS生成森林的后序遍历对G的顶点编号。

//后序DFS遍历图G,并将节点按后序遍历的顺序编号

int *PostDFS(DiGraph G)

{

int NumVertex=G->NumVertex;

int visited[NumVertex];

int i;

for (i=0;i

{

visited[i]=0;//初始化,所有节点都未被访问过

}

int *post = malloc( sizeof( int ) * NumVertex );//用于存放后序DFS遍历时,节点的编号

if( post == NULL ) FatalError( "Out of space!!!" );

int postCounter=0;

//定义一个内嵌的DFS函数

void DFS (Vertex v)//从节点v出发执行DFS

{

visited[v]=1;//标记该节点被访问

Position P = Header( G->Table[v].Header );

if( !IsEmpty( G->Table[v].Header ) )

{

do//对节点v的所有邻接点递归调用DFS

{

P = Advance( P );

Vertex w=Retrieve( P );

if (visited[w]==0)//v的邻接点w未被访问过

{

DFS(w);

}

} while( !IsLast( P, G->Table[v].Header ) );

}

post[v]=postCounter;

postCounter++;

}

Vertex j;

for (j=0;j

{

if (visited[j]==0) DFS(j);

}

return post;

}

(3)求图G的强连通分量

int *StrongConnectedComponent(DiGraph G)//求图G的强连通分量

{

//DFS后序遍历图G,并将节点按后序遍历的顺序编号存入post数组

int *post=PostDFS(G);

//求图G的逆置GR

DiGraph GR=ReverseGraph(G);

//按post编号从大到小顺序在GR上执行DFS,所得连通分量就是原图G的强连通分量

int NumVertex=GR->NumVertex;

int visited[NumVertex];

int i;

for (i=0;i

{

visited[i]=0;//初始化,所有节点都未被访问过

}

int *sccID = malloc( sizeof( int ) * NumVertex );//用于标记强连通分量的数组

if( sccID == NULL ) FatalError( "Out of space!!!" );

int sccCounter=0;

//定义一个内嵌的DFS函数

void DFS (Vertex v)//从节点v出发执行DFS

{

visited[v]=1;//标记该节点被访问

sccID[v]=sccCounter;

Position P = Header( GR->Table[v].Header );

if( !IsEmpty( GR->Table[v].Header ) )

{

do//对节点v的所有邻接点递归调用DFS

{

P = Advance( P );

Vertex w=Retrieve( P );

if (visited[w]==0)//v的邻接点w未被访问过

{

DFS(w);

}

} while( !IsLast( P, GR->Table[v].Header ) );

}

}

int m;

for (m=NumVertex-1;m>=0;m--)//按post编号从大到小顺序在GR上执行DFS,因为图G有可能不是连通的

{

Vertex n;

for (n=0;n

{

if (post[n]==m)//节点n的编号为当前最大值

{

if (visited[n]==0)

{

相关文档
最新文档