暴躁蒟蒻在线水题er日记

暴躁蒟蒻在线水题er日记

自从寒假在外面浪出一片新天地突然被告知要上信奥课而且已经上了一半了以后,除了问候掉链子的班主任全家当然是忙着…补寒假作业和奥赛课程,反正基本上开始听课都是人生终极三问:“我是谁?我在哪?我在干什么?(为什么他们什么都会?我是怎么考进来的?)”
特别感谢@id:qq_30150143,借了我一份代码copy one down,接下来我们来研究一下这段代码是个什么原理。

题目如下~

01:图的深度优先遍历与广度优先遍历
总时间限制:1000ms
内存限制:65535kB

描述
给出一个无向图顶点和边的信息,输出这个无向图的深度优先遍历序列和广度优先遍历序列。从一个顶点出发如果有2个以上的顶点可以访问时,我们约定先访问编号大的那个顶点。示例输入对应的图如下图所示:奇丑无比的手绘图(不是我画的!绝对是我们老师干的!)
输入
输入的第1行有2个整数m和n。表示图g有m个顶点和n条边。
第2行是m个以空格隔开的字符串,依次是图中第1个顶点的名字,第2个顶点的名字…第m个顶点的名字。
此后还有n行,每行由2个字符串构成,分别是构成图中1条边的两个顶点。我们约定不会有重边。
输出
输出有2行。
第1行是从第1个顶点出发对图g做深度优先遍历得到的顶点序列。
第2行是从第1个顶点出发对图g做广度优先遍历得到的顶点序列。
样例输入

8 9
v1 v2 v3 v4 v5 v6 v7 v8
v1 v2
v1 v3
v1 v6
v2 v3
v2 v4
v3 v4
v4 v6
v5 v6
v7 v8

样例输出

v1 v6 v5 v4 v3 v2 v7 v8
v1 v6 v3 v2 v5 v4 v7 v8

思路~(并没有,不可能有的)

先把代码放上来再说

#include<bits/stdc++.h>
using namespace std;
int mapp[1000][1000],a[1000],book[1000],path[1000];
int m,n,idx;
void dfs(int x){
	if(book[x]){
		return;
	}
	book[x]=1;
	path[++idx]=x;
	for(int i=m;i>=1;i--){
		if(mapp[x][i])dfs(i);
	}
}
void bfs(int x){
	if(book[x])return;
	queue<int> q;
	q.push(a[x]);
	path[++idx]=x;
	book[x]=1;
	while(!q.empty()){
		for(int i=m;i>=1;i--){
			if(!book[i]&&mapp[q.front()][i]){
				path[++idx]=i;
				book[i]=1;
				q.push(i);
			}
		}
		q.pop();
	}
}
int main(){
	cin>>m>>n;
	char gg;
	for(int i=1;i<=m;i++){
		cin>>gg>>a[i]; 
	}
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>gg>>x>>gg>>y;
		mapp[x][y]=mapp[y][x]=1;
	}
	for(int i=1;i<=m;i++){
		dfs(i);
	}
	for(int i=1;i<=idx;i++){
		cout<<"v"<<path[i]<<" ";
	}
	idx=0;
	memset(path,0,sizeof(path));
	memset(book,0,sizeof(book));
	cout<<endl;
	for(int i=1;i<=m;i++){
		bfs(i);
	}
	for(int i=1;i<=idx;i++){
		cout<<"v"<<path[i]<<" ";
	}
	return 0;
}

那么我们来深入♂研究一下他的代码是怎么搞♂出来的!
其实就是深度优先搜索和广度优先搜索结合起来…也没啥好研究的…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值