题目信息: https://www.patest.cn/contests/pat-a-practise/1090
提交情况:
提交代码:
#include <iostream>
#include <string.h>
#include <vector>
#include <math.h>
#define Max 100010
using namespace std;
vector<int> child[Max];
int root[Max],Root,depth,visit[Max],n,depths[Max];
double rootPrice,percent;
void DFS( int vertex ,int depth )
{
visit[vertex] = 1;
depths[vertex] = depth; //得到节点的深度
for( int i=0;i<child[vertex].size();++i )
{
int key = child[vertex][i];
if( visit[key] == 0 )
{
++depth; //跟踪节点的深度
DFS(key,depth);
--depth; //递归结束,回到父节点,相应的深度 减一
}
}
}
int main()
{
cin>>n>>rootPrice>>percent;
for( int i=0;i<n;++i ) //输入处理
{
cin>>root[i]; //输入节点i的供应商root[i],即root[i]是节点i的父节点
child[root[i]].push_back(i);
if( root[i] == -1 ) //找到根节点
Root = i;
}
// cout<<"Root is "<<Root<<endl;
depth = 1;
DFS(Root,depth);
int maxDepth = -1,number = 0;
for( int i=0;i<n;++i ) //得到最大的深度,并用number记录最大深度的个数
{
if( depths[i] > maxDepth )
{
maxDepth = depths[i];
number = 1;
}
else if ( depths[i] == maxDepth )
{
++number;
}
//以下代码查看各节点的深度
// if( i == n-1 )
// cout<<depths[i]<<endl;
// else
// cout<<depths[i]<<" ";
}
printf("%.2lf %d",rootPrice*pow(1+percent/100,maxDepth-1),number);
return 0;
}
越来越感觉某些算法越来越像了,就像上面代码中寻找树的最大深度的过程:
for( int i=0;i<n;++i ) //得到最大的深度,并用number记录最大深度的个数
{
if( depths[i] > maxDepth )
{
maxDepth = depths[i];
number = 1;
}
else if ( depths[i] == maxDepth )
{
++number;
}
}
和最短路径,最小生成树(普利姆算法)的过程太像了。都是寻找当前最优的,或者是最优子结构,我记得有这么个词,这就是贪心的思想吧 [手动发呆表情],果然实践出真知 [好像很懂的表情]。