首页 > 其他分享 >数据结构实验三 2024_树与图实验

数据结构实验三 2024_树与图实验

时间:2024-11-18 12:57:19浏览次数:1  
标签:输出 遍历 int 样例 2024 实验 二叉树 数据结构 dis

数据结构实验三 2024_树与图实验

7-1 根据后序和中序遍历输出前序遍历

本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的前序遍历结果。

输入格式:

第一行给出正整数 n (≤30),是树中结点的个数。随后两行,每行给出 n 个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。

输出格式:

在一行中输出Preorder: 以及该树的前序遍历结果。数字间有1个空格,行末不得有多余空格。

输入样例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出样例:

Preorder: 4 1 3 2 6 5 7

题目分析

  • 根据中序遍历和后序遍历的得到前序遍历的方法为,每次通过后序遍历找到根节点,然后递归左右子树,递归的方法为,在中序遍历中计算出左子树和右子树的大小,然后在后序遍历中确定左右子树序列范围
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
int n,tot=0;
int a[50],b[50],ans[50];
int find(int l,int r,int x){
	for(int i=l;i<=r;i++){
		if(a[i]==x) return i;
	}
	return 0;
}
void dfs(int l1,int r1,int l2,int r2){
	int rt=b[r2];//b[r2]为根节点
	int id=find(l1,r1,rt);
	ans[++tot]=rt;
	if(id==0) return;
	if(id>l1) dfs(l1,id-1,l2,r2-r1+id-1);
	if(id<r1) dfs(id+1,r1,l2+id-l1,r2-1);
}
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>b[i];
	for(int i=1;i<=n;i++) cin>>a[i];
	dfs(1,n,1,n);
	cout<<"Preorder: ";
	for(int i=1;i<=n;i++) cout<<ans[i]<<" "[i==n];
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int T=1;
	while(T--) solve();
	return 0;
}

7-2 完全二叉树的层序遍历

一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就是完全二叉树

给定一棵完全二叉树的后序遍历,请你给出这棵树的层序遍历结果。

输入格式:

输入在第一行中给出正整数 N(≤30),即树中结点个数。第二行给出后序遍历序列,为 N 个不超过 100 的正整数。同一行中所有数字都以空格分隔。

输出格式:

在一行中输出该树的层序遍历序列。所有数字都以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

8
91 71 2 34 10 15 55 18

输出样例:

18 34 55 71 2 10 15 91

题目分析

  • 由于是完全二叉树,根据完全二叉树的性质可以知道,在层序遍历中,若i为当前子树根节点,则2i为左孩子节点,2i+1为右孩子节点,代码中用u<<1 与 u<<1|1表示左右孩子
  • 那么可以模拟后序遍历的顺序,计算出层序遍历的答案
#include<bits/stdc++.h>
#define endl '\n'
#define lc u<<1
#define rc u<<1|1
using namespace std;
int n,tot=1;
int a[50],ans[50];
void dfs(int u){
	if(u>n) return;
	dfs(lc);
	dfs(rc);
	ans[u]=a[tot];
	tot++;
}
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	dfs(1);
	for(int i=1;i<=n;i++) cout<<ans[i]<<" "[i==n];
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int T=1;
	while(T--) solve();
	return 0;
}

7-3 最短工期

一个项目由若干个任务组成,任务之间有先后依赖顺序。项目经理需要设置一系列里程碑,在每个里程碑节点处检查任务的完成情况,并启动后续的任务。现给定一个项目中各个任务之间的关系,请你计算出这个项目的最早完工时间。

输入格式:

首先第一行给出两个正整数:项目里程碑的数量 N(≤100)和任务总数 M。这里的里程碑从 0 到 N−1 编号。随后 M 行,每行给出一项任务的描述,格式为“任务起始里程碑 任务结束里程碑 工作时长”,三个数字均为非负整数,以空格分隔。

输出格式:

如果整个项目的安排是合理可行的,在一行中输出最早完工时间;否则输出"Impossible"。

输入样例 1:

9 12
0 1 6
0 2 4
0 3 5
1 4 1
2 4 1
3 5 2
5 4 0
4 6 9
4 7 7
5 7 4
6 8 2
7 8 4

输出样例 1:

18

输入样例 2:

4 5
0 1 1
0 2 2
2 1 3
1 3 4
3 2 5

输出样例 2:

Impossible

题目分析

  • 拓扑排序,每次取出入度为0的点,删除该点与所有与该点相连的边,(即所有与其相连的点入度-1),然后其相连点的答案,这里用f[i]表示到达i点,满足所有前驱已完成时至少需要花费的时间
  • 注意判断无解情况,即判断该有向图是否有环(拓扑拆图之后若还有剩余点则存在环)
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N=110;
struct node{
	int to,w;
};
vector<node> g[N];
int n,m,tot=0;
int ind[N],f[N];
void topo(){
	queue<int> q;
	for(int i=0;i<n;i++){
		if(ind[i]==0){
			tot++;
			q.push(i);
		}
	}
	while(q.size()){
		int u=q.front();
		q.pop();
		for(auto [v,w]:g[u]){
			ind[v]--;
			f[v]=max(f[v],f[u]+w);
			if(ind[v]==0){
				tot++;
				q.push(v);
			}
		}
	}
	
}
void solve(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v,w;cin>>u>>v>>w;
		g[u].push_back({v,w});
		ind[v]++;
	}
	topo();
	int ans=0;
	if(tot!=n){
		cout<<"Impossible"<<endl;
		return;
	}
	for(int i=0;i<n;i++) ans=max(ans,f[i]);
	cout<<ans<<endl;

}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int T=1;
	while(T--) solve();
	return 0;
}

7-4 旅游规划

有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。

输入格式:

输入说明:输入数据的第 1 行给出 4 个正整数 nmsd,其中 n(2≤n≤500)是城市的个数,顺便假设城市的编号为 0~(n−1);m 是高速公路的条数;s 是出发地的城市编号;d 是目的地的城市编号。随后的 m 行中,每行给出一条高速公路的信息,分别是:城市 1、城市 2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过 500。输入保证解的存在。

输出格式:

在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20

输出样例:

3 40

题目分析

  • 多权最短路模板,和dij写法基本相同,只需要在运算符重载时判断一下条件优先级即可
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=510;
int n,m,st,ed;
struct node{
	int to,w,c;
	bool operator< (const node rhs)const{
		if(w!=rhs.w) return w>rhs.w;  //大的优先级小
		else return c>rhs.c;
	}
};
vector<node> g[N];
bool vis[N];
int dis[N],cost[N];
void dij(int x){
	priority_queue<node> q;
	dis[x]=0,cost[x]=0;
	q.push({x,0,0});
	while(!q.empty()){
		auto t=q.top();
		q.pop();
		int u=t.to;
		if(vis[u]) continue;
		for(auto tmp:g[u]){
			auto [v,w,c]=tmp;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				cost[v]=cost[u]+c;
				q.push({v,dis[v],cost[v]});
				continue;	
			}
			if(dis[v]==dis[u]+w && cost[v]>cost[u]+c){
				dis[v]=dis[u]+w;
				cost[v]=cost[u]+c;
				q.push({v,dis[v],cost[v]});
			}
		}
	}
}
void init(){
	for(int i=0;i<=n+5;i++){
		dis[i]=cost[i]=1e9;
		vis[i]=0;
	}
}
void solve(){
	cin>>n>>m>>st>>ed;
	init();
	for(int i=1;i<=m;i++){
		int u,v,w,c;cin>>u>>v>>w>>c;
		g[u].push_back({v,w,c});
		g[v].push_back({u,w,c});
	}
	dij(st);
	cout<<dis[ed]<<" "<<cost[ed]<<endl;

}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int T=1;
	while(T--) solve();
	return 0;
}

标签:输出,遍历,int,样例,2024,实验,二叉树,数据结构,dis
From: https://www.cnblogs.com/personaowl/p/18552361

相关文章

  • Z-Library最新可用官方网址及镜像入口【2024持续更新】
    Z-Library是一家电子图书馆,被誉为全球最大的科学图书和学术文献免费资源之一。它创办于2009年,截至2022年10月1日,已收录超过1129万本图书和8483万篇学术文章。从各种知名文学著作,理工学科,人文艺术、到学术论文等应有尽有!支持PDF、epub、mobi等多种格式图书资源下载绝对是你找书......
  • 内衣洗衣机的十大排行:2024年十大强悍内衣洗衣机汇总
    平时我们在日常生活中衣服免不了沾上各种细菌、毛发和污渍,如果把这些衣服和贴身衣物混洗就会比较容易出现交叉感染,而受感染后贴身衣物有可能造成人体患上皮肤病。为此,所以很多人都会选择单独手洗贴身衣物,但其实手洗很容易出现清洁不干净的问题,这时候内衣洗衣机就能很好解决这个......
  • 图论入门书籍(2024.11.16)
    1、我的第一本算法书(2018年11月)2、程序员的数学4:图论入门(图灵出品)3、图论入门[Graphs:AnIntroduction](2022.09)4、啊哈!算法5、趣味的图论问题6、动画算法与数据结构(图灵出品)-2024.037、图论一个迷人的世界(2022.09)8、现代图论9、图论算法理......
  • NOIP 模拟赛:2024-11-16
    全体栽在T1?T1:二分一下内存大小然后模拟判断。关键点在于意识到"解码"和"播放"这两种事件是分开的。用一个while循环,每次循环从"完成某帧的解码"、"开始某帧的解码"、"播放某帧"、"删除某帧"之间选时间最早的时间执行。T2:板题,并查集额外记录个vector然后启发式合......
  • 【2024-11-15】坚持早睡
    20:00学会和无能共处的人能学习到很多东西。它会引领我们重视最渺小的东西,知道自己的局限,这些都是更高的要求。                                                 ——荣......
  • 【2024-11-17】连岳摘抄
    23:59我们与其说身体是我们的生命,不如说我们的一切“活动”与“行为’”才是我们的生命。                                                 ——钱人生很不容易,也很......
  • 2024年阿里云双11年度大促:云服务器低至1折起
    2024年阿里云双11年度大促:云服务器低至1折起,要参与2024年阿里云双十一活动,您可以按照以下步骤进行:一、前期准备注册/登录阿里云账号访问阿里云官网,根据页面提示完成账号注册或登录。了解活动信息在阿里云官网的活动页面或相关公告中,了解双十一活动的具体信息,包括活动时间......
  • 2024年腾讯云双11云服务器大促详解,优惠享不停
    一、2024年腾讯云双十一活动时间腾讯云双十一活动将于即日起至2024年11月30日,活动时间跨度很长,让用户有足够的时间选购自己所需的云产品和服务。具体以页面变更为准。二、2024年腾讯云双十一活动入口腾讯云双11活动:【点此直达】了解。​​三、2024年腾讯云双十一活动内容......
  • 2024年腾讯云双十一活动:腾讯云11.11上云拼团Go活动详细说明
    一、2024年腾讯云双十一活动时间腾讯云双十一活动将于即日起至2024年11月30日,活动时间跨度很长,让用户有足够的时间选购自己所需的云产品和服务。具体以页面变更为准。二、2024年腾讯云双十一活动入口腾讯云双11活动入口:【点此直达】了解。​三、2024年腾讯云双十一活动......
  • 2024网鼎杯青龙组Misc详解
    MISC01某单位网络遭到非法的攻击,安全人员对流量调查取证之后保存了关键证据,发现人员的定位信息存在泄露,请对其进行分析。flag为用户位置信息进行32位md5哈希值位置信息,所有我们开始试ip地址,试了一堆发现思路错误,4g通讯流量,直接问ChatgptMD5加密MISC02题目附件给了一个未知......