#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#define PATH
#define VERTEX_NUM 8
#ifdef PATH
int count = 1;
#endif
bool visited[VERTEX_NUM + 1]; // 访问标志数组(备忘表)
struct ArcNode {
int adjvex;
ArcNode *nextarc;
};
int FirstAdjVex(ArcNode *G[VERTEX_NUM + 1], int v)
{
if (G[v] == NULL) // v是孤立顶点
return -1;
return G[v]->adjvex;
}
int NextAdjVex(ArcNode *G[VERTEX_NUM + 1], int v, int w)
{
for (ArcNode *p = G[v]; p != NULL; p = p->nextarc) {
if (p->adjvex == w) { // 找到w,将返回
if (p->nextarc == NULL) // w已是v的最后一个邻接点
return -1;
return p->nextarc->adjvex;
}
}
cout << "错误!没找到w" << endl;
return -1;
}
void DFS(ArcNode *G[VERTEX_NUM + 1], int v)
{
// 从第v个顶点出发递归地深度优先遍历图G。
int w;
visited[v] = true;
cout << v << endl;
for (w = FirstAdjVex(G, v); w != -1; w = NextAdjVex(G, v, w)) {
#ifdef PATH
cout << "------------------" << count++ << "----" << v << "->" << w << endl; // 1
#endif
if (!visited[w]) { // 对v的尚未访问的邻接顶点w递归调用DFS
DFS(G, w);
#ifdef PATH
cout << v << endl; // 有待研究? // 2
#endif
}
}
#ifdef PATH
cout << "回溯路径" << v << "->"; // 3
#endif
}
void DFSTraverse(ArcNode *G[VERTEX_NUM + 1])
{
// 对图G作深度优先遍历。
int v;
for (v = 1; v <= VERTEX_NUM; ++v)
visited[v] = false; // 访问标志数组初始化
for (v = 1; v <= VERTEX_NUM; ++v) { // 若是连通图,则v=1即全遍历到
if (!visited[v])
DFS(G, v); // 对尚未访问的顶点调用DFS
}
cout << endl;
}
void CreatAdjListGraph(ArcNode *G[VERTEX_NUM + 1])
{
int a;
int b;
while (cin >> a >> b, !(a == 0 && b == 0)) { //以0 0作为输入结束
ArcNode *p = new ArcNode;
if (p == NULL) {
cout << "OVERFLOW!" << endl;
exit(OVERFLOW);
}
p->adjvex = b;
p->nextarc = G[a]; // 头插入
G[a] = p;
ArcNode *q = new ArcNode;
if (q == NULL) {
cout << "OVERFLOW!" << endl;
exit(OVERFLOW);
}
q->adjvex = a;
q->nextarc = G[b]; // 头插入
G[b] = q;
}
}
void Display(ArcNode *G[VERTEX_NUM + 1])
{
for (int i = 1; i <= VERTEX_NUM; i++) { // 输出邻接表
cout << i;
for (ArcNode *p = G[i]; p != NULL; p = p->nextarc) {
cout << "->" << p->adjvex ;
}
cout << endl;
}
}
void Free(ArcNode *G[VERTEX_NUM + 1])
{
for (int i = 1; i <= VERTEX_NUM; i++) {
for (ArcNode *p = G[i]; p != NULL;) {
ArcNode *q = p;
p = p->nextarc;
delete q;
q = NULL;
}
}
}
int main(int argc, char **argv)
{
freopen("cin.txt", "r", stdin);
ArcNode *G[VERTEX_NUM + 1] = {NULL};
CreatAdjListGraph(G); // 建图(邻接表表示)
Display(G); // 显示图
DFSTraverse(G); // 遍历图
Free(G); // 释放图
return 0;
}
/* cin.txt:
2
4
5
4
5
3
6
7
7
0
*/