SCAU 8648 图的深度遍历 与 8649 图的广度遍历

本文提供了一段C++代码,展示了如何使用深度优先搜索(DFS)和广度优先搜索(BFS)来遍历有向图和无向图。代码中使用了栈和队列作为邻接表的一部分,并利用STL库进行实现。代码适用于处理各种类型的图,包括有向图、有向网、无向图和无向网。
摘要由CSDN通过智能技术生成

由于oj给的代码过于长(每次都得补一大堆,而且要理解它给的函数的意思,懒),所以就借助一些大佬的想法与自己的再次创作写了下面的图的创建,dfs与bfs,大家可以参考一下(注:用到一些STL)算法的思想我相信各位都是会的那就不注释了(其实是我懒

#include<stack>
#include<math.h>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0)
#include<algorithm>
#include<queue>
typedef long long ll;
//有向图:0,有向网:1,无向图:2,无向网:3


void dfs(int x, stack<int>* list, int v[], string s[]) {
	if (v[x] == 1)return;//访问过,返回
	cout << s[x] << ' ';
	v[x] = 1;
	int len = list[x].size();
	for (int i = 0; i < len; i++) {
		int t = list[x].top();
		list[x].pop();
		if (v[t] == 0)dfs(t, list, v, s);
	}
}

void bfs(int x, stack<int>* list, int v[], string s[]) {
	if (v[x] == 0)
	{
		cout << s[x] << ' ';
		v[x] = 1;
		queue<int>q;
		q.push(x);
		while (!q.empty()) {
			int u = q.front(), w;
			q.pop();
			while (!list[u].empty()) {
				w = list[u].top();
				list[u].pop();
				if (v[w] == 0) {
					cout << s[w] << ' ';
					v[w] = 1;
				}
			}
		}
	}
}
int main()
{
	int v[20] = { 0 };//标记数组
	int type;
	string x, y;
	int w;//权值
	cin >> type;
	int n, m;//顶点,边数
	cin >> n >> m;
	string* s = new string[n + 1]{ "" };//存所有顶点,下标为对应编号
	stack<int>list[21];//充当邻接表
	for (int i = 1; i <= n; i++) {//输入顶点名称
		cin >> s[i];
	}
	for (int i = 1; i <= m; i++) {
		x = y = "";
		if (type == 1 || type == 3)cin >> x >> y >> w;//为网的时候需要加上权值
		else cin >> x >> y;
		int p = -1, q = -1;//弧头弧尾的下标
		for (int j = 1; j <= n; j++) {
			if (x == s[j])p = j;
			else if (y == s[j])q = j;
			if (p != -1 && q != -1)break;//找到就退出
		}
		if (type == 0 || type == 1)//如果有向
			list[p].push(q);
		else {
			list[p].push(q);
			list[q].push(p);
		}
	}
	//dfs
	//for (int i = 1; i <= n; i++)dfs(i, list, v, s);
	for (int i = 1; i <= n; i++)bfs(i, list, v, s);

}

emm复习时发现代码可以更简单点,并且发现oj的样例有点水额咳咳
改进版

#include <iostream>
#include<algorithm>
#include<math.h>
typedef long long ll;
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#include<iostream>
using namespace std;
#include<cstring>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<list>

stack<int>s[105];
int v, e;//顶点数和边数
int type;//(有向图:0,有向网:1,无向图:2,无向网:3);
string str[105] = { "" };
int visit[105];

void dfs(int x) {
	if (visit[x] == 0) {
		visit[x] = 1;
		cout << str[x] << ' ';
		int cur = s[x].top();
		s[x].pop();
		dfs(cur);
	}
}

void bfs() {
	visit[0] = 1;
	cout << str[0] << ' ';
	int k = 0;
	for (int i = 0; i < v; i++) {
		while (!s[i].empty()) {
			int cur = s[i].top();
			s[i].pop();
			if (visit[cur] == 0) {
				visit[cur] = 1;
				cout << str[cur] << ' ';
			}
		}
	}
}



int main()
{
	IOS;
	cin >> type;
	cin >> v >> e;
	for (int i = 0; i < v; i++)cin >> str[i];
	string t, f;
	int w = 0;
	for (int i = 0; i < e; i++) {
		if (type == 0 || type == 2)
		{
			cin >> t >> f;
			int tpos=0, fpos=0;
			for (int j = 0; j < v; j++) {
				if (t == str[j])tpos = j;
				else if (f == str[j])fpos = j;
			}
			s[tpos].push(fpos);
			if (type == 2) s[fpos].push(tpos);
		}
		else {
			cin >> t >> f >> w;
			int tpos, fpos;
			for (int j = 0; j < v; j++) {
				if (t == str[j])tpos = j;
				else if (f == str[j])fpos = j;
			}
			s[tpos].push(fpos);
			if (type == 3) s[fpos].push(tpos);
		}
	}
	//bfs();
	//cout << endl;
	for (int i = 0; i < v; i++)dfs(i);
}
SCAU综合实验课程中的文件操作与字符处理是一门非常重要的课程,它教授了如何使用计算机来操作文件以及对文件中的字符进行处理。 文件操作是指使用计算机来创建、打开、读取、写入、修改和关闭文件的过程。在实验中,我们学习了如何使用C++编程语言来实现这些文件操作。通过实践,我们可以掌握文件的基本操作,比如创建文件、打开已存在的文件、从文件中读取数据、向文件中写入数据和关闭文件等等。这些操作对于日常的文件处理工作非常有用。 字符处理是指对文件中的字符进行操作和处理的过程。我们学习了如何使用C++语言中的字符串类和字符数组来对字符进行处理。通过实验,我们可以掌握字符串的创建、拼接、截取、替换和转换等操作。这些操作可以帮助我们更好地处理文件中的文本数据,比如查找特定的字符、计算字符串的长度、在字符串中查找子字符串等等。 此外,我们还学习了一些常见的文件操作和字符处理的应用,比如统计一个文件中的字符数、单词数和行数,将一个文件中的大写字母转换为小写字母,将一个文件中的所有空格替换为换行符等等。这些应用可以帮助我们更好地理解文件操作和字符处理的实际应用场景,并提高我们的实际操作能力。 综上所述,SCAU综合实验中的文件操作与字符处理课程是非常实用和重要的一门课程,它教授了我们使用计算机来操作文件和处理字符的技能和知识。通过学习这门课程,我们可以提高我们的实际操作能力,为以后的工作做好准备。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值