题目
题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805362341822464
思路
思路其实就是DFS,找最短的路径即可。
其实大家可能会可能对输入有疑问,不知道输入是在说什么。
这里的意思其实是给了图的邻接表表示法,第一行代表和编号0邻接的节点有编号为2、3、5的节点。更进一步,你可以认为只是个有向图,示意如下:
代码
#include <iostream>
#include <vector>
#include <cmath>
#include <climits>
using namespace std;
vector<int> adj[100005];//邻接表
int mindepth = INT_MAX, count = 0;
void dfs(int u, int depth){
if(mindepth < depth) return;//如果最小深度已经找到,直接返回
//到达叶子节点
if(adj[u].size() == 0){
//假如当前深度小,则更新最小深度,如果和最小深度相同,则计数器加一
if(depth < mindepth){
mindepth = depth;
count = 1;
}
else if(depth == mindepth){
count++;
}
}
//对于和顶点u邻接的顶点,dfs
for(int i=0; i<adj[u].size(); i++){
int v = adj[u][i];//取顶点
dfs(v, depth+1);
}
}
int main(){
int n, k, c;
double p, r;
scanf("%d %lf %lf", &n, &p, &r);
for(int i=0; i<n; i++){
scanf("%d", &k);
//如果输入为0,那么就不会往邻接表里追加数据
for(int j=0; j<k; j++){
scanf("%d", &c);
adj[i].push_back(c);//构造邻接表
}
}
dfs(0, 0);
printf("%.4f %d", p * pow(1+r/100, mindepth), count);
return 0;
}
参考文献
https://blog.youkuaiyun.com/liuchuo/article/details/52214448
算法笔记