在AdjacencyList.h中:
#ifndef AdjacencyList_H
#define AdjacencyList_H
#include "stdio.h"
#include "stdlib.h"
#define WHITE 0
#define GRAY 1
#define BLACK 2
typedef struct node *node_ptr;
struct node
{
int to_vertex;
int is_tree_edge;
node_ptr next;
};
void Init();
void CreateDG_AL();
void DFS_Visit(int);
void DFS_Traverse();
void JudgeAndOutput();
void FreeAdjacencyList();
#endif
在AdjacencyList.cpp中:
#include "AdjacencyList.h"
FILE *file;
int n_vertices;
int *d;
int *f;
int *color;
node_ptr *g;
int time=0;
void Init()/*初始化*/
{
int i;
int temp;
file=freopen("input1","r",stdin);
temp=scanf("%d",&n_vertices);
d=(int *)malloc(n_vertices*sizeof(int));//发现事件的时间
f=(int *)malloc(n_vertices*sizeof(int));//结束事件的时间
color=(int *)malloc(n_vertices*sizeof(int));//顶点的颜色
g=(node_ptr *)malloc(n_vertices*sizeof(node_ptr));
for(i=0;i<n_vertices;i++)
{
color[i]=WHITE;
d[i]=0;
f[i]=0;
}
}
void CreateDG_AL()/*创建有向图*/
{
int outEdges=0;
int data=0;
int i;
int j;
int temp;
node_ptr p;
for( i=0;i<n_vertices;i++)
{
g[i]=NULL;
temp=scanf("%d",&outEdges);
for(j=0;j<outEdges;j++)
{
temp=scanf("%d",&data);
p=(node_ptr)malloc(sizeof(struct node));
p->to_vertex=data;
p->is_tree_edge=0;
p->next=g[i];
g[i]=p;
}
}
}
void DFS_Visit(int u)/*从某个顶点开始进行深度遍历*/
{
node_ptr p;
int v;
color[u]=GRAY;
d[u]=++time;
for(p=g[u];p;p=p->next)
{
v=p->to_vertex;
if(color[v]==WHITE)
{
p->is_tree_edge=1;
DFS_Visit(v);
}
}
color[u]=BLACK;
f[u]=++time;
}
void DFS_Traverse()/*对每个结点进行深度遍历*/
{
int u;
for(u=0;u<n_vertices;u++)
{
if(color[u]==WHITE)
DFS_Visit(u);
}
}
void JudgeAndOutput()/*按邻接表的顺序进行输出边的分类*/
{
node_ptr p;
int u;
for(u=0;u<n_vertices;u++)
{
p=g[u];
while(p)
{
if(p->is_tree_edge==1)
{
printf("tree\n");
p=p->next;
}
else
{
int v=p->to_vertex;
if(d[u]<d[v] && d[v]<f[v] && f[v]<f[u])
printf("forward\n");
else if(d[v]<d[u] && d[u]<f[u] && f[u]<f[v])
printf("back\n");
else if(d[v]<f[v] && f[v]<d[u] && d[u]<f[u])
printf("cross\n");
p=p->next;
}
}
}
}
void FreeAdjacencyList()//释放空间
{
free(d);
free(f);
free(color);
free(g);
}
在Main.cpp中:
#include "AdjacencyList.h"
int main()
{
Init();
CreateDG_AL();
DFS_Traverse();
JudgeAndOutput();
FreeAdjacencyList();
return 0;
}
测试数据:
7 2 6 2 0 2 6 4 2 5 0 1 1 1 4 1 1