//深度优先搜索算法在搜素过程中对节点进行涂色来指明节点的状态。
//每个节点的初始颜色都是白色的,在节点被发现后变成灰色的,在其邻接链表被扫描完成后变为黑色的。
//该方法保证每个节点仅在一颗深度优先树中出现,因此,所有的深度优先树都是不相交的。
//深度优先搜素的另一个性质:节点的发现时间和完成时间具有所谓的括号化的结构
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <climits>
using namespace std;
//这里dfs在每个节点上盖了一个时间戳,每个节点v有两个时间戳:
//第一个时间戳v.d记录节点v第一次被发现的时间(图上灰色的时候),第二个时间戳v.f记录的是搜索完成对v的邻接链表的扫描时间(图上黑色的时候)
struct ListNode{
int val;
int color;//white=0,gray=1,black=2;
int d;//发现节点的时刻
int f;//完成对节点处理的时刻
vector<ListNode*> next;//存储所有的邻接节点
ListNode* pre;
ListNode(int x):color(0),val(x),d(0),f(0),pre(NULL){
}
};
void insert(ListNode* L,ListNode* n)
{
L->next.push_back(n);
}
void show(ListNode* L)//显示该节点的所有邻接节点
{
int n=L->next.size();
for(int i=0;i<n;i++)
cout<<(L->next)[i]->val<<" ";
}
int time=0;//变量time是一个全局变量,用来计算时间戳
void dfs_visit(ListNode* a[],int n,ListNode