//有向图的强连通分量:利用深度优先搜索求有向图的强连通分量
//---《数据结构C语言版》教材中算法---\\
//步骤1:在有向图G上,从某个顶点出发沿以该顶点为尾的弧进行深度优先搜索遍历,
//并按其所有邻接点的搜索都完成(即退出DFS函数)的顺序将顶点排列起来
//步骤2:在有向图G上,从最后完成搜索的顶点出发,沿着以该顶点为头的弧作逆向的深度优先搜索遍历。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTEX_NUM 20
#define INFINITY INT_MAX
typedef int Status;
#define OK 1
#define ERROR 0
typedef enum {FALSE,TRUE} Boolean;
typedef int InfoType; //定义弧相关信息为整形
typedef char VertexType; //定义顶点类型为字符型
typedef char ElemType;
//十字链表表示的图结构
typedef struct ArcNode
{
int tailvex,headvex; //该弧所指向的顶点在顺序结构中的位置
struct ArcNode *hlink,*tlink; //分别为与该弧头邻接(同一尾结点)的下一条弧的指针和与该弧尾邻接(同一尾结点)的下一条弧的指针
InfoType *info; //该弧相关信息的指针
}ArcNode; //弧结构
typedef struct VNode
{
VertexType data; //顶点
ArcNode *firstin,*firstout; //分别为该顶点的第一条入弧和第一条出弧
}VNode,OrtList[MAX_VERTEX_NUM]; //顶点结构
typedef struct
{
OrtList vertices; //顶点数组
int vexnum,arcnum; //顶点数和弧数
}OLGraph; //十字链表表示的图结构
//树结构:孩子兄弟链
typedef struct CSNode
{
ElemType data;
struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;
Status CreateDG(OLGraph *G);
int LocateVex(OLGraph G,VertexType v);
void DGDFSTraverse(OLGraph G);
void DGDFS(OLGraph G,int v,int *count);
void DGDFSForest(OLGraph G,CSTree *T);
void DGDFSTree(OLGraph G,int v,CSTree *t);
void CSTreeTraverse(CSTree T);
int FirstAdjVex_Out(OLGraph G,int v);
int NextAdjVex_Out(OLGraph G,int v,int w);
int FirstAdjVex_In(OLGraph G,int v);
int NextAdjVex_In(OLGraph G,in