树的遍历A1079 A1090 A1094 A1106 A1004

A1079

#include<bits/stdc++.h>
using namespace std;
struct node{
    int amount;
    vector<int> child;
};
int N;
double P,r;
node n[100001];
double sum=0;
void dfs(int cur,double danjia)
{
    if(n[cur].amount){//如果是叶结点
        sum+=n[cur].amount*danjia;
    }
    else{
        danjia*=(1+r/100);
        for(int each:n[cur].child)
        {
            dfs(each,danjia);
        }
    }
}
int main()
{
    cin>>N>>P>>r;
    int i,j,k;
    for(i=0;i<N;i++)
    {
        cin>>j;
        if(j){//非叶结点
            while(j--)
            {
                cin>>k;
                n[i].child.push_back(k);
            }
        }
        else{
            cin>>n[i].amount;
        }
    }
    dfs(0,P);
    printf("%.1f",sum);
    
    return 0;
}

A1090

#include<bits/stdc++.h>
using namespace std;
int N;
double P,r;
vector<int> v[100001];//v代表父结点 
int depth[100001];

void dfs(int cur)
{
	for(int each:v[cur]){//遍历 
		depth[each]=depth[cur]+1; 
		dfs(each);
	}
}
int main()
{
	cin>>N>>P>>r;
	int i,j,k;
	int root;
	for(i=0;i<N;i++)
	{
		cin>>j;
		if(j>=0) v[j].push_back(i);
		else root=i;//找到了根结点 
	}
	//root是根结点 
	depth[root]=0;
	dfs(root); 
	int maxdepth=0;
	for(i=0;i<N;i++){
		if(depth[i]>maxdepth) maxdepth=depth[i];
	}
	int res=0;
	for(i=0;i<N;i++){
		if(depth[i]==maxdepth) res++;
	}
	for(i=maxdepth;i--;){
		P*=(1+r/100);
	}
	printf("%.2f %d",P,res);
	
	return 0;
}

A1094

#include<bits/stdc++.h>
using namespace std;

vector<int>child[100];
int N,M;
int num_of_level[100]={0};//每一层的数量先初始化为0 
void dfs(int cur,int cur_level)//第一个结点第一层 
{
	num_of_level[cur_level]++;//第几层有多少个结点 
	for(int each:child[cur])//遍历这棵树 
	{
		dfs(each,cur_level+1);//深度搜索 
	 } 
}
int main()
{
	cin>>N>>M;
	int i,j,k;
	while(M--)
	{
		cin>>i>>k;
		while(k--){
			cin>>j;
			child[i].push_back(j);
		}
	}//输入完毕
	dfs(1,1);
	int maxnum=0,maxnum_level=0;
	for(i=1;i<=100;i++)
	{
		if(num_of_level[i]>maxnum_level)
		{
			maxnum_level=num_of_level[i];
			maxnum=i;
		}
	 } 
	cout<<maxnum_level<<" "<<maxnum;
	return 0;
 } 

A1106
没读懂题意导致做错

#include<bits/stdc++.h>
using namespace std;

int N;
double P,r;
vector<int> child[100001];

int minlevel=100000;//最小层的层次 
int num_of_level;//最小层的人数 
//遍历求深度 
void dfs(int curid,int curlevel)
{
	if(child[curid].empty())//如果是叶子结点 
	{
		if(curlevel==minlevel)
		{
			num_of_level++;
		}
		else if(curlevel<minlevel)
		{
			minlevel=curlevel;
			num_of_level=1;
		}
	}
	else
	{
		for(int each:child[curid])
		{
			dfs(each,curlevel+1);
		}
	}
	
}
int main()
{
	cin>>N>>P>>r;//
	int i,j,k;
	for(i=0;i<N;i++)
	{
		cin>>k;
		while(k--)
		{
			cin>>j;
			child[i].push_back(j);
		}
	}	
	dfs(0,0);
	
	for(i=minlevel;i--;)
	{
		P*=(1+r/100);
	 } 
	printf("%.4f %d\n",P,num_of_level);//输出最小层的人数
	
	return 0;
}

A1004

#include<bits/stdc++.h>
using namespace std;

vector<int> child[100]; 
int N,M;
//看每层有多少个叶结点 
int num_of_level[100]={0};//每一层的叶结点数 
int maxlevel;//最大层次,每一层次的 
void dfs(int cur,int curlevel)//当前结点,当前层次 
{
	if(curlevel>maxlevel) maxlevel=curlevel;//求最大层次 
	if(child[cur].size()){//如果是非叶结点 
		for(int each:child[cur])
		{
			dfs(each,curlevel+1);
		}
	} 
	else{//如果是叶结点 
		num_of_level[curlevel]++;
	}
	
}
int main()
{
	cin>>N>>M;//M个结点,N个非叶结点 
	int i,j,k;
	while(M--)
	{
		cin>>i>>k;//i是父结点,k是结点个数 
		while(k--)
		{
			cin>>j;//j是子结点
			child[i].push_back(j); 
		}
	 } 
	dfs(1,1); 
	for(i=1;i<=maxlevel;i++)
	{
		if(i!=maxlevel) cout<<num_of_level[i]<<" ";
		else cout<<num_of_level[i];
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值