除法求值bfs实现c++代码

pair 的用法

std::pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型。
C++标准程序库中凡是“必须返回两个值”的函数, 也都会利用pair对象。
class pair可以将两个值视为一个单元。容器类别map和multimap就是使用pairs来管理其健值/实值(key/value)的成对元素。
pair被定义为struct,因此可直接存取pair中的个别值.。
两个pairs互相比较时, 第一个元素正具有较高的优先级.。

make_pair的用法

无需写出型别, 就可以生成一个pair对象

class Solution {
public:
    //定义邻接矩阵:key是某个顶点,val是所有 与当前顶点相连的其它顶点 及 两点之间的边组成的pair 的集合
    unordered_map<string,vector<pair<string,double>>>mp;

    vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
        //adjmap mp;
        int len = equations.size();
        for(int i=0;i<len;i++){
            //获取与当前顶点a相连的顶点b,并获得a->b的距离
            mp[equations[i][0]].push_back(make_pair(equations[i][1],values[i])); 
            //获取与当前顶点b相连的顶点a,并获得b->a的距离           
            mp[equations[i][1]].push_back(make_pair(equations[i][0],1/values[i]));
        }
        vector<double> result(queries.size());
        //使用广度优先搜索获取任意两点之间的距离
        for(int i=0;i<result.size();i++) result[i] = BFS(queries[i][0],queries[i][1],mp);
        return result;
    }
private:
    double BFS(string& a, string& b,   unordered_map<string,vector<pair<string,double>>> &mp){
        //筛选条件1:如果这两个顶点中的任意一个都不是邻接矩阵的key,直接return-1;
        if(mp.find(a)==mp.end() || mp.find(b)==mp.end()) return -1.0;
        //筛选条件2:如果输入的两个顶点是同一个,直接return1.;
        if(a==b) return 1.0;
        //构建队列,存放着某个 结点 和 该结点与初始结点的累积距离 组成的pair
        queue<pair<string,double>> que;
        //某个结点是否进入队列的依据:它是否被访问过。bool比int空间少
        unordered_map<string,bool> visited(false);
        //首先把起始结点push进入队列
        que.push(make_pair(a,1.0));
        //如果队列不为空
        while(!que.empty()){
            //获取头部
            auto front = que.front();
            visited[front.first] = true;
            que.pop();
            //如果头部元素的first是我们找的结点,那么直接返回second,也就是累积距离
            if(front.first==b) return front.second;
            //广度优先搜索:如果还没有找到,就把当前结点的邻居push进入队列
            for(auto it:mp[front.first]){
                //如果这个邻居没有被访问到,那么就把这个邻居 和 从起始结点到这个邻居的累积距离 push进入队列
                if(visited[it.first]==false) que.push(make_pair(it.first,front.second*it.second));
            }
        }
        //没有找到
        return -1.0;
    }
};

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值