Day 45 算法笔记之提高篇(3) 数据结构专题(2)9.3(2)

目录

1.The Largest Generation

2.Lowest Price in Supply Chain

3.Counting Leaves(dfs)

4.Counting Leaves(bfs)


1.The Largest Generation

#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;

const int maxn=110;
vector<int> node[maxn];
int hashtable[maxn] = {0};

void dfs(int index,int level){
	hashtable[level]++;
	for(int j=0;j<node[index].size();j++){
		dfs(node[index][j],level+1);
	}
}


int main(){
	
	int n,m;
	scanf("%d%d",&n,&m);
	
	int parent,k,child;
	for(int i=0;i<m;i++){
		scanf("%d%d",&parent,&k);
		for(int j=0;j<k;j++){
			scanf("%d",&child);
			node[parent].push_back(child);
		} 
	}
	
	dfs(1,1);
	int maxvalue=0,maxlevel=-1;
	for(int i=1;i<maxn;i++){
		if(hashtable[i]>maxvalue){
			maxlevel=i;
			maxvalue=hashtable[i];
		}
	}
	
	printf("%d %d\n",maxvalue,maxlevel);
	return 0;
}

2.Lowest Price in Supply Chain

#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;

const int maxn=100010;
const int INF = 10000;
vector<int> node[maxn];
int n,num=0;
double p,r,ans=INF;

void dfs(int index,int depth){
	if(node[index].size()==0){
		double price=p*pow(1+r,depth);
		if(price<ans){
			ans=price;
			num=1;
		}else if(price==ans){
			num++;
		}
		return;
	}
	for(int i=0;i<node[index].size();i++){
		dfs(node[index][i],depth+1);
	}
}

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

3.Counting Leaves(dfs)

#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;

const int N = 110;
vector<int> node[N];
int leaf[N] = {0};
int max_h=1;

void dfs(int index,int h){
	max_h=max(h,max_h);//统计一下树的深度罢了
	if(node[index].size()==0){
		leaf[h]++;
		return;
	}
	for(int i=0;i<node[index].size();i++){
		dfs(node[index][i],h+1);
	}
}

int main(){
	
	int n,m;
	scanf("%d %d",&n,&m);
	int parent,k,child;
	for(int i=0;i<m;i++){
		scanf("%d%d",&parent,&k);
		for(int j=0;j<k;j++){
			scanf("%d",&child);
			node[parent].push_back(child);
		}
	}
	dfs(1,1);
	printf("%d",leaf[1]);
	for(int i=2;i<=max_h;i++){
		printf(" %d",leaf[i]);
	}
	
	
	return 0;
}

4.Counting Leaves(bfs)

#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;

const int N = 105;
vector<int> node[N];
int h[N] = {0};
int leaf[N] = {0};
int max_h = 0;

void bfs(){
	queue<int> q;
	q.push(1);
	while(!q.empty()){
		int id=q.front();
		q.pop();
		max_h=max(max_h,h[id]);
		if(node[id].size()==0){
			leaf[h[id]]++;
		}
		for(int i=0;i<node[id].size();i++){
			h[node[id][i]] = h[id]+1;
			q.push(node[id][i]);
		}
		
	}
}

int main(){
	
	int n,m;
	scanf("%d%d",&n,&m);
	int parent,k,child;
	for(int i=0;i<m;i++){
		scanf("%d%d",&parent,&k);
		for(int j=0;j<k;j++){
			scanf("%d",&child);
			node[parent].push_back(child);
		}
	}
	
	h[1] = 1;
	bfs();
	for(int i=1;i<=max_h;i++){
		if(i==1) printf("%d",leaf[i]);
		else printf(" %d",leaf[i]);
	}
	
	
	return 0;
}

おすすめ

転載: blog.csdn.net/aixiaoxiao13/article/details/121468207