栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

7-41 图深度优先遍历分数 20

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

7-41 图深度优先遍历分数 20

编写程序对给定的有向图(不一定连通)进行深度优先遍历,图中包含n个顶点,编号为0至n-1。本题限定在深度优先遍历过程中,如果同时出现多个待访问的顶点,则优先选择编号最小的一个进行访问,以顶点0为遍历起点。

输入格式:

输入第一行为两个整数n和e,分别表示图的顶点数和边数,其中n不超过20000,e不超过50。接下来e行表示每条边的信息,每行为两个整数a、b,表示该边的端点编号,但各边并非按端点编号顺序排列。

输出格式:

输出为一行整数,每个整数后一个空格,即该有向图的深度优先遍历结点序列。

输入样例1:
3 3
0 1
1 2
0 2

输出样例1:
0 1 2 

输入样例2:
4 4
0 2
0 1
1 2
3 0

输出样例2:
0 1 2 3 

代码长度限制

16 KB

时间限制

50 ms

内存限制

64 MB

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#define MaxVertexNum 20000
int Visited[MaxVertexNum];
typedef struct ENode* PtrToENode;
struct ENode {
	int V1, V2;
};
typedef PtrToENode Edge;
typedef struct AdjVNode* PtrToAdjVNode;
struct AdjVNode {
	int AdjV;
	PtrToAdjVNode Next;
};
typedef struct Vnode {
	PtrToAdjVNode FirstEdge;
}AdjList[MaxVertexNum];
typedef struct GNode* PtrToGNode;
struct GNode {
	int Nv;
	int Ne;
	AdjList G;
};
typedef PtrToGNode LGraph;
LGraph CreateGraph(int VertexNum) {
	int V;
	LGraph Graph;
	Graph = (LGraph)malloc(sizeof(struct GNode));
	Graph->Nv = VertexNum;
	Graph->Ne = 0;
	for (V = 0; V < Graph->Nv; V++)
		Graph->G[V].FirstEdge = NULL;
	return Graph;
}
void InsertEdge(LGraph Graph, Edge E) {
	PtrToAdjVNode NewNode, w;
	NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
	NewNode->AdjV = E->V2;
	NewNode->Next = NULL;
	w = Graph->G[E->V1].FirstEdge;
	if (w == NULL)
		Graph->G[E->V1].FirstEdge = NewNode;
	else {
		if (w->AdjV > NewNode->AdjV) {
			Graph->G[E->V1].FirstEdge = NewNode;
			NewNode->Next = w;
		}
		else {
			while (w->Next && w->Next->AdjV < NewNode->AdjV) {
				w = w->Next;
			}
			NewNode->Next = w->Next;
			w->Next = NewNode;
		}
	}
}
void Visit(int v) {
	printf("%d ", v);
}
void DFS(LGraph Graph, int v) {
	if (!Visited[v]) {
		PtrToAdjVNode w;
		Visit(v);
		Visited[v] = 1;
		for (w = Graph->G[v].FirstEdge; w; w = w->Next) {
			if (!Visited[w->AdjV])
				DFS(Graph, w->AdjV);
		}
	}
}
int main() {
	LGraph Graph;
	Edge E;
	int V, e;
	int Nv, i;
	scanf("%d", &Nv);
	Graph = CreateGraph(Nv);
	scanf("%d", &(Graph->Ne));
	if (Graph->Ne != 0) {
		E = (Edge)malloc(sizeof(struct ENode));
		for (i = 0; i < Graph->Ne; i++) {
			scanf("%d%d", &E->V1, &E->V2);
			InsertEdge(Graph, E);
		}
	}
	for (i = 0; i < Graph->Nv; i++)
		Visited[i] = 0;
	for (i = 0; i < Graph->Nv; i++) {
		if (!Visited[i]) {
			DFS(Graph, i);
		}
	}
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/931623.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号