1106---BFS找最短路径

题目内容
题目参考链接: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值