CS 400 BFS-DFS 构造

本文介绍了一种算法,该算法根据给定的深度优先搜索(DFS)和广度优先搜索(BFS)序列来构造一个图。具体地,对于n个节点的图(从1开始编号),若能根据给定的DFS和BFS序列重构出图的边,则输出这些边;若无法构造,则输出-1。文章提供了一个C++实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:n个点的图 起点都为1,给出其dfs和bfs序列 若有解,求出其m条边 否则输出-1.n<=4096. 边的个数<=1e5.
第2个点如果不同 则无解.

构造:1和按顺序和b[i]连边  然后对每个(d[i-1],d[i])[i>1] 连一条边 此时满足bfs,dfs序列(66666).

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> ii;
const int N=4e3+120;
int n,b[N],d[N];
map<int,int> mp[N];
vector<ii> res;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		scanf("%d",&b[i]);
	for(int i=1;i<=n;i++)
		scanf("%d",&d[i]);
	if(b[2]!=d[2])
	{
		puts("-1");
		return 0;
	}
	for(int i=2;i<=n;i++)
	{
		mp[1][b[i]]=1;
		res.push_back(ii(1,b[i]));
	}
	for(int i=2;i<=n;i++)
	{
		if(mp[d[i-1]][d[i]])
			continue;
		mp[d[i-1]][d[i]]=1;
		res.push_back(ii(d[i-1],d[i]));
	}
	printf("%d\n",res.size()); 
	for(int i=0;i<res.size();i++)
		printf("%d %d\n",res[i].first,res[i].second);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值