强化阶段 Day 19 算法笔记 9.3 树的遍历

本文介绍了树的先根遍历和层序遍历两种算法,并展示了如何找到等权重路径、供应链的总销售额、最高价格、最大代数、最低价格以及叶子节点计数。同时,提供了在给定成本和增长率下计算供应链总销售的解决方案以及求最长和最短供应链的方法。
摘要由CSDN通过智能技术生成

目录

1.先根遍历

2.层序遍历

3.Path of Equal Weight

4.Total Sales of Supply Chain

5.Highest Price in Supply Chain

6.The Largest Generation

7.Lowest Price in Supply Chain

8.Counting Leaves


1.先根遍历

void preorder(int root){
	printf("%d ",martix[root].data);
	for(int i=0;i<martix[root].child.size();i++){
		preorder(martix[root].child[i]);
	}
}

2.层序遍历

void layer(int root){
	queue<int> q;
	martix[root].layer=0;
	q.push(root);
	while(!q.empty()){
		int now=q.front();
		q.pop();
		printf("%d ",martix[now].data);
		for(int i=0;i<martix[now].child.size();i++){
			int child=martix[now].child[i];
			martix[child].layer=martix[now].layer+1;
			q.push(child);
		}
	}
}

3.Path of Equal Weight

#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;

const int maxn=105;
int n,m,s;
struct{
	int data;
	vector<int> child;
}martix[maxn];

bool cmp(int a,int b){
	return martix[a].data>martix[b].data;
}
int path[maxn]; 
void dfs(int index,int numnode,int sums){
	if(sums>s) return;
	if(sums==s){
		if(martix[index].child.size()!=0) return;
		for(int i=0;i<numnode;i++){
			printf("%d",martix[path[i]].data);
			if(i<numnode-1) printf(" ");
			else printf("\n");
		}
		return;
	}
	for(int i=0;i<martix[index].child.size();i++){
		int child=martix[index].child[i];
		path[numnode]=child;
		dfs(child,numnode+1,sums+martix[child].data);
	}
}



int main(){
	scanf("%d%d%d",&n,&m,&s);
	for(int i=0;i<n;i++){
		scanf("%d",&martix[i].data);
	}
	int father,child,num;
	for(int i=0;i<m;i++){
		scanf("%d %d",&father,&num);
		for(int j=0;j<num;j++){
			scanf("%d",&child);
			martix[father].child.push_back(child);
		}
		sort(martix[father].child.begin(),martix[father].child.end(),cmp);
	}
	path[0]=0;
	dfs(0,1,martix[0].data);
	
	return 0;
}

4.Total Sales of Supply Chain

#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;

const int maxn=100005;
struct{
	int data;
	vector<int> child;
}martix[maxn];
double p,r;
double ans=0;
void dfs(int index,int depth){
	if(martix[index].child.size()==0){
		ans+=martix[index].data*pow(1+r,depth);
		return;
	}
	for(int i=0;i<martix[index].child.size();i++){
		dfs(martix[index].child[i],depth+1);
	}
}



int main(){
	
	int n;
	
	scanf("%d %lf %lf",&n,&p,&r);
	r/=100;
	int num,child;
	for(int i=0;i<n;i++){
		scanf("%d",&num);
		if(num!=0){
			for(int j=0;j<num;j++){
				scanf("%d",&child);
				martix[i].child.push_back(child);
			}
		}else{
			scanf("%d",&martix[i].data);
		}
	}
	
	dfs(0,0);
	printf("%.1f",ans*p);
	
	return 0;
}

5.Highest Price in Supply Chain

#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;

const int maxn=100005;
vector<int> martix[maxn];
int n;
double p,r;
int maxlength=0,num=0;
void dfs(int index,int length){
	if(martix[index].size()==0){
		if(length>maxlength){
			maxlength=length;
			num=1;
		}else if(length==maxlength){
			num++;
		}
		return;
	}
	for(int i=0;i<martix[index].size();i++){
		dfs(martix[index][i],length+1);
	}
}

int main(){
	
	scanf("%d%lf%lf",&n,&p,&r);
	r/=100;
	int father,root;
	for(int i=0;i<n;i++){
		scanf("%d",&father);
		if(father!=-1){
			martix[father].push_back(i);
		}else{
			root=i;
		}
	}
	dfs(root,0);
	printf("%.2f %d\n",p*pow(r+1,maxlength),num);
	
	
	
	return 0;
}

6.The Largest Generation

#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;

const int maxn=110;
struct{
	int layer;
	vector<int> child;
}martix[maxn];
int level[maxn]={0};
void bfs(int root){
	queue<int> q;
	q.push(root);
	martix[root].layer=1;
	while(!q.empty()){
		int now=q.front();
		q.pop();
		level[martix[now].layer]++;
		for(int i=0;i<martix[now].child.size();i++){
			int child=martix[now].child[i];
			martix[child].layer=martix[now].layer+1;
			q.push(child);
		}
	}
}

int main(){
	
	int n,m;
	scanf("%d %d",&n,&m);
	int father,num,child;
	for(int i=0;i<m;i++){
		scanf("%d%d",&father,&num);
		for(int j=0;j<num;j++){
			scanf("%d",&child);
			martix[father].child.push_back(child);
		}
	}
	bfs(1);
	
	int maxlength=-1,maxlevel;
	for(int i=1;i<maxn;i++){
		if(level[i]>maxlength){
			maxlength=level[i];
			maxlevel=i;
		}
	}
	printf("%d %d\n",maxlength,maxlevel);
	
	return 0;
}

7.Lowest Price in Supply Chain

#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;

const int maxn=100005;
vector<int> martix[maxn];
int minlength=maxn,num;
int n;
double p,r;
void dfs(int index,int order){
	if(martix[index].size()==0){
		if(order<minlength){
			minlength=order;
			num=1;
		}else if(order==minlength){
			num++;
		}
		return;
	}
	for(int i=0;i<martix[index].size();i++){
		dfs(martix[index][i],order+1);
	}
}

int main(){
	scanf("%d%lf%lf",&n,&p,&r);
	r/=100;
	int nums,child;
	for(int i=0;i<n;i++){
		scanf("%d",&nums);
		if(nums!=0){
			for(int j=0;j<nums;j++){
				scanf("%d",&child);
				martix[i].push_back(child);
			}
		}
	}
	dfs(0,0);
	printf("%.4f %d",p*pow(1+r,minlength),num);
	
	return 0;
}

8.Counting Leaves

#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;

const int maxn=101;
struct{
	int layer;
	vector<int> child;
}martix[101];
int ans[maxn]={0},l=-1;

void bfs(int root){
	queue<int> q;
	q.push(root);
	martix[root].layer=0;
	while(!q.empty()){
		int now=q.front();
		q.pop();
		if(martix[now].child.size()==0){
			ans[martix[now].layer]++;
			if(martix[now].layer>l) l=martix[now].layer;
		}
		for(int i=0;i<martix[now].child.size();i++){
			int child=martix[now].child[i];
			martix[child].layer=martix[now].layer+1;
			q.push(child);
		}
	}
}

int main(){
	
	int n,m;
	scanf("%d %d",&n,&m);
	int father,num,child;
	for(int i=0;i<m;i++){
		scanf("%d%d",&father,&num);
		for(int j=0;j<num;j++){
			scanf("%d",&child);
			martix[father].child.push_back(child);
		}
	}
	bfs(1);
	for(int i=0;i<=l;i++){
		printf("%d",ans[i]);
		if(i!=l) printf(" ");
	}
	
	return 0;
}
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;

const int maxn=101;
vector<int> martix[maxn];
int ans[maxn],l=-1;
void dfs(int index,int layer){
	if(martix[index].size()==0){
		ans[layer]++;
		if(layer>l) l=layer;
		return;
	}
	for(int i=0;i<martix[index].size();i++){
		dfs(martix[index][i],layer+1);
	}
}

int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	int father,num,child;
	for(int i=0;i<m;i++){
		scanf("%d %d",&father,&num);
		for(int j=0;j<num;j++){
			scanf("%d",&child);
			martix[father].push_back(child);
		}
	}
	dfs(1,0);
	for(int i=0;i<=l;i++){
		printf("%d",ans[i]);
		if(i!=l) printf(" ");
	} 
	
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值