有向图的强连通分量
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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) {