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;
}