zoukankan      html  css  js  c++  java
  • PAT1106(BFS)

    PAT 1106

    思路

    BFS用在tree上,这一个题里主要关注的是用vector去保存每一个节点所连接的子节点,当BFS 时,一旦发现该节点下面没有子节点,这一层一定是最短的路径,然后用当前的层数去为后面的节点做判断,如果接下来,仍然有节点没有子节点,那么用层数去验 证,如果层数一致则是,否则不是。

    STL——vector

    vector

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<vector>
     6 #include<queue>
     7 #define LL long long;
     8 using namespace std;
     9 const int MAXN=100005;
    10 double pi,r;
    11 struct node//节点
    12 {
    13     int v;//节点编号
    14     int cnt;//记录距离根节点的层数
    15 };
    16 vector <int> p[MAXN];//构造这棵树
    17 queue <node> q;
    18 int minct=-1;
    19 int bfs()
    20 {
    21     int c=0;
    22     bool flag = false;
    23 
    24     while(!q.empty())
    25     {
    26         node nd = q.front();
    27         q.pop();
    28         int id = nd.v;
    29         int ct = nd.cnt;
    30         //初始情况下flag记为false,也就是还未有叶子节点
    31         //当第一次出现有叶子节点是flag变为true
    32         //如果flag记为true,那么后面的节点如果还有子节点也没有必要再放进去了
    33         if(p[id].size()!=0)
    34         {
    35             if(flag==false)
    36             {
    37                 int len = p[id].size();
    38                 for(int i = 0;i<len;i++)
    39                 {
    40                     node tn={p[id][i],ct+1};//结构体对象赋值的简化表达
    41                     q.push(tn);
    42                 }
    43             }
    44         }
    45         else
    46         {
    47             //如果第一次有叶子节点即(flag==false)
    48             //或者后面发现叶子节点层数相同(minct==ct)
    49             if(flag==false||minct==ct)
    50             {
    51                 flag=true;
    52                 minct=ct;
    53                 c++;
    54             }
    55         }
    56     }
    57     return c;
    58 }
    59 int main()
    60 {
    61     freopen("1106.txt","r",stdin);
    62     int m,k,t,s;
    63     cin>>m>>pi>>r;
    64     for(int i = 0;i<m;i++)
    65     {
    66         scanf("%d",&k);
    67         for(int j = 1;j<=k;j++)
    68         {
    69             scanf("%d",&t);
    70             p[i].push_back(t);
    71         }
    72     }
    73     node nd;
    74     nd.v=0;
    75     nd.cnt=0;
    76     q.push(nd);
    77     s = bfs();
    78     for(int i = 1;i<=minct;i++)
    79     {
    80         pi=pi*(1+r/100.0);
    81     }
    82     printf("%.4lf %d
    ",pi,s);
    83     return 0;
    84 }
  • 相关阅读:
    数据库数据格式化之Kettle Spoon
    NopCommerce开源项目中很基础但是很实用的C# Helper方法
    oracle 两个逗号分割的字符串 如何判断是否其中有相同值
    MongoDB+MongoVUE安装及入门
    C#中Dictionary<TKey,TValue>排序方式
    kettle的基本介绍
    Kettle能做什么?
    oracle like 条件拼接
    loading加载和layer.js
    关于bootstrap的treeview不显示多选(复选框)的问题,以及联动选择的问题,外加多选后取值
  • 原文地址:https://www.cnblogs.com/fancy-itlife/p/5216020.html
Copyright © 2011-2022 走看看