题目内容
题目参考链接:https://www.patest.cn/contests/pat-a-practise/1106
题目分析
1.题目分析完是找最短路径,用BFS很好
2.注意与1079分别。博客链接:http://blog.csdn.net/zhanggirlzhangboy/article/details/78543299
3.1079是求叶子节点的路径,1106是求最短路径
代码如下
#include <iostream>
#include <queue>
#include <vector>
#include <math.h>
#include <stdio.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
const int MAX = 100000+5;
vector< vector<int> > v(MAX);
int ans[MAX];
int num = 0;
int BFS(int n){
queue<int> q;
q.push(n);
int level = -1;//记录层次
int min = MAX;
while(!q.empty()){
int size = q.size();
level++;
for(int i=0;i<size;i++){//类似树的层次遍历
int top = q.front();
q.pop();
int len = v[top].size();
if(len!=0){//判断是否是叶子节点
for(int i=0;i<len;i++){
q.push(v[top][i]);
}
}
else{
if(min>level){//求最小的层次
min = level;
}
ans[top]=level;
}
}
}
return min;
}
int main(int argc, char *argv[]) {
int n;
double p,r;
cin>>n>>p>>r;
for(int i=0;i<n;i++){
int k;
cin>>k;
for(int j=0;j<k;j++){
int id;
cin>>id;
v[i].push_back(id);
}
}
int min = BFS(0);//最小的层次
for(int i=0;i<n;i++){//求个数
if(ans[i]==min){
num++;
}
}
printf("%.4lf %d\n",pow((1+r/100),min)*p,num);
return 0;
}